Redisson分布式锁集成2.4+
最后更新于:2022-04-02 07:10:22
# Redisson分布式锁集成2.4+
> JeecgBoot 分布式锁集成了redisson,本文以jeecg-demo模块为例介绍如何集成分布式锁
>应用场景:秒杀、团购、购买火车票、以及一系列高并发应用
[TOC]
## 第一步 jeecg-demo模块pom文件中引入分布式锁依赖
~~~
org.jeecgframework.boot
jeecg-boot-starter-lock
~~~
## 第二步 jeecg-demo模块中编写分布式锁测试demo
~~~
/**
* 分布式锁测试demo
*/
@Slf4j
@Component
public class DemoLockTest {
@Autowired
RedissonLockClient redissonLock;
/**
*注解方式测试分布式锁
*/
@Scheduled(cron = "0/5 * * * * ?")
@JLock(lockKey= "redis-lock")
public void execute() throws InterruptedException {
log.info("执行execute任务开始,休眠三秒");
Thread.sleep(3000);
System.out.println("=======================业务逻辑1=============================");
log.info("execute任务结束,休眠三秒");
}
/**
* 编码方式测试分布式锁
*/
@Scheduled(cron = "0/10 * * * * ?")
public void execute2() throws InterruptedException {
if (redissonLock.tryLock("redisson", -1, 10000)) {
log.info("执行任务execute2开始,休眠三秒");
Thread.sleep(3000);
System.out.println("=======================业务逻辑2=============================");
log.info("定时execute2结束,休眠三秒");
redissonLock.unlock("redisson");
} else {
log.info("execute2获取锁失败");
}
}
}
~~~
## JLock注解使用说明(注意:原注解名DistributedLock)
~~~
public @interface JLock{
/**
* 锁的模式:如果不设置,自动模式,当参数只有一个.使用 REENTRANT 参数多个 MULTIPLE
*/
LockModel lockModel() default LockModel.AUTO;
/**
* 如果keys有多个,如果不设置,则使用 联锁
* @return
*/
String[] lockKey() default {};
/**
* key的静态常量:当key的spel的值是LIST,数组时使用+号连接将会被spel认为这个变量是个字符串
* @return
*/
String keyConstant() default "";
/**
* 锁超时时间,默认30000毫秒
*
* @return int
*/
long expireSeconds() default 30000L;
/**
* 等待加锁超时时间,默认10000毫秒 -1 则表示一直等待
*
* @return int
*/
long waitTime() default 10000L;
/**
* 未取到锁时提示信息
*
* @return
*/
String failMsg() default "获取锁失败,请稍后重试";
}
~~~
~~~
自定义lockKey
@JLock(lockKey= "redis-lock")
lockKey支持spel表达式
@JLock(lockKey="#user.name")
@JLock(lockKey ={"#user.name","#user.id"})
~~~
## JRepeat(防止重复提交) 注解使用说明
~~~
/**
* 防止重复提交的注解
*
* @author 2019年6月18日
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface JRepeat {
/**
* 分布式锁枚举类
*
* @return
*/
LockConstant lockConstant();
/**
* redis 锁key的
*
* @return redis 锁key
*/
String lockKey() default "";
/**
* 过期秒数,默认为5秒
*
* @return 轮询锁的时间
*/
int expire() default 5;
/**
* 超时时间单位
*
* @return 秒
*/
TimeUnit timeUnit() default TimeUnit.SECONDS;
/**
*
';
Key的分隔符(默认 :)
*生成的Key:N:SO1008:500
* * @return String */ String delimiter() default ":"; } ~~~ ## 分布式锁配置文件说明 分布式锁配置文件在jeecg专有配置中如下 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/42/38/4238241fa3f1709eccab2bb07a3f558b_813x678.png) address:连接地址和端口 password:redis密码 type:redis部署方式 enabled:是否启用分布式锁 支持单机、哨兵、集群、主从4中redis部署方式 ### 1单机配置示例 ~~~ redisson.address=127.0.0.1:6379 redisson.type=STANDALONE ~~~ ### 2 哨兵配置示例 **redisson.lock.server.address**格式为: sentinel.conf配置里的sentinel别名,sentinel1节点的服务IP和端口,sentinel2节点的服务IP和端口,sentinel3节点的服务IP和端口 比如sentinel.conf里配置为sentinel monitor my-sentinel-name 127.0.0.1 6379 2,那么这里就配置my-sentinel-name ~~~ redisson.address=my-sentinel-name,127.0.0.1:26379,127.0.0.1:26389,127.0.0.1:26399 redisson.type=SENTINEL ~~~ ### 3 集群配置示例 cluster方式至少6个节点(3主3从,3主做sharding,3从用来保证主宕机后可以高可用) 地址格式为: 127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382,127.0.0.1:6383,127.0.0.1:6384 ~~~ redisson.address=127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382,127.0.0.1:6383,127.0.0.1:6384 redisson.type=CLUSTER ~~~ ### 4 主从配置示例 比如:127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381 代表主节点:127.0.0.1:6379,从节点127.0.0.1:6380,从127.0.0.1:6381 ~~~ redisson.address=127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381 redisson.type=MASTERSLAVE ~~~