- Notifications
You must be signed in to change notification settings - Fork131
redis分布式锁工具包,提供纯Java方式调用,支持传统Spring工程, 为spring boot应用提供了starter,更方便快捷的调用。
License
TaXueWWL/redis-distributed-lock
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
redis分布式锁工具包,提供纯Java方式调用,支持传统Spring工程,为spring boot应用提供了starter,更方便快捷的调用。
redis-distributed-lock-core 原生redis分布式锁实现,支持注解,不推荐项目中使用,仅供学习使用
redis-distributed-lock-demo-spring redis-distributed-lock-core 调用实例,仅供学习
redis-distributed-lock-starter 基于Redisson的分布式锁spring starter实现,可用于实际项目中
redis-distributed-lock-starter-demo redis-distributed-lock-starter调用实例
配置文件application.properties中引入
redisson.lock.server.address=127.0.0.1:6379 redisson.lock.server.type=standalone针对springboot应用只需要引入依赖
<!--分布式锁redisson版本--> <dependency> <groupId>com.snowalker</groupId> <artifactId>redis-distributed-lock-starter</artifactId> <version>1.0.0</version> </dependency>直接编程方式调用如下,在需要加锁的定时任务中,注入RedissonLock 实体,即可进行加锁、解锁等操作。
锁自动释放时间默认为10秒,这个时间需要你根据自己的业务执行时间自行指定。@Autowired RedissonLock redissonLock; @Scheduled(cron = "${redis.lock.cron}") public void execute() throws InterruptedException { if (redissonLock.lock("redisson", 10)) { LOGGER.info("[ExecutorRedisson]--执行定时任务开始,休眠三秒"); Thread.sleep(3000); System.out.println("=======================业务逻辑============================="); LOGGER.info("[ExecutorRedisson]--执行定时任务结束,休眠三秒"); redissonLock.release("redisson"); } else { LOGGER.info("[ExecutorRedisson]获取锁失败"); } }你可以改变测试demo的端口,起多个查看日志,能够看到同一时刻只有一个实例获取锁成功并执行业务逻辑
2018-07-10 23:00:12.810 |-INFO [main] org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer [198] -| Tomcat started on port(s): 8888 (http) 2018-07-10 23:00:12.814 |-INFO [main] com.snowalker.RedisDistributedLockStarterDemoApplication [57] -| Started RedisDistributedLockStarterDemoApplication in 2.684 seconds (JVM running for 3.038) 2018-07-10 23:00:15.033 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.RedissonLock [35] -| 获取Redisson分布式锁[成功],lockName=redisson 2018-07-10 23:00:15.034 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonNormal [27] -| [ExecutorRedisson]--执行定时任务开始,休眠三秒 =======================业务逻辑============================= 2018-07-10 23:00:18.035 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonNormal [30] -| [ExecutorRedisson]--执行定时任务结束,休眠三秒 2018-07-10 23:00:20.005 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.RedissonLock [35] -| 获取Redisson分布式锁[成功],lockName=redisson 2018-07-10 23:00:20.006 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonNormal [27] -| [ExecutorRedisson]--执行定时任务开始,休眠三秒 =======================业务逻辑=============================
前提条件同样是要引入依赖
<!--分布式锁redisson版本--> <dependency> <groupId>com.snowalker</groupId> <artifactId>redis-distributed-lock-starter</artifactId> <version>1.0.0</version> </dependency>注解方式调用如下,在需要加锁的定时任务的执行方法头部,添加@DistributedLock(value = "redis-lock", expireSeconds = 11)即可进行加锁、解锁等操作。
锁自动释放时间默认为10秒,这个时间需要你根据自己的业务执行时间自行指定。
我这里以spring schedule定时任务为例,用其他的定时任务同理,只需要添加注解。@Scheduled(cron = "${redis.lock.cron}") @DistributedLock(value = "redis-lock", expireSeconds = 11) public void execute() throws InterruptedException { LOGGER.info("[ExecutorRedisson]--执行定时任务开始,休眠三秒"); Thread.sleep(3000); System.out.println("=======================业务逻辑============================="); LOGGER.info("[ExecutorRedisson]--执行定时任务结束,休眠三秒"); }你可以改变测试demo的端口,起多个查看日志,能够看到同一时刻只有一个实例获取锁成功并执行业务逻辑
2018-07-11 09:48:06.330 |-INFO [main] com.snowalker.RedisDistributedLockStarterDemoApplication [57] -| Started RedisDistributedLockStarterDemoApplication in 3.901 seconds (JVM running for 4.356) 2018-07-11 09:48:10.006 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.annotation.DistributedLockHandler [32] -| [开始]执行RedisLock环绕通知,获取Redis分布式锁开始 2018-07-11 09:48:10.622 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.RedissonLock [35] -| 获取Redisson分布式锁[成功],lockName=redis-lock 2018-07-11 09:48:10.622 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.annotation.DistributedLockHandler [39] -| 获取Redis分布式锁[成功],加锁完成,开始执行业务逻辑... 2018-07-11 09:48:10.625 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonAnnotation [22] -| [ExecutorRedisson]--执行定时任务开始,休眠三秒 =======================业务逻辑============================= 2018-07-11 09:48:13.625 |-INFO [pool-3-thread-1] com.snowalker.executor.ExecutorRedissonAnnotation [25] -| [ExecutorRedisson]--执行定时任务结束,休眠三秒 2018-07-11 09:48:13.627 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.annotation.DistributedLockHandler [46] -| 释放Redis分布式锁[成功],解锁完成,结束业务逻辑... 2018-07-11 09:48:13.628 |-INFO [pool-3-thread-1] com.snowalker.lock.redisson.annotation.DistributedLockHandler [50] -| [结束]执行RedisLock环绕通知
redisson.lock.server.address=127.0.0.1:6379 redisson.lock.server.type=standalone redisson.lock.server.password= redisson.lock.server.database=1redisson.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.server.address=my-sentinel-name,127.0.0.1:26379,127.0.0.1:26389,127.0.0.1:26399 redisson.server.type=sentinel redisson.lock.server.password= redisson.lock.server.database=1cluster方式至少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.server.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.server.type=cluster redisson.lock.server.password= redisson.lock.server.database=1地址格式为主节点,子节点,子节点
比如: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.server.address=127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381 redisson.server.type=masterslave redisson.lock.server.password= redisson.lock.server.database=1About
redis分布式锁工具包,提供纯Java方式调用,支持传统Spring工程, 为spring boot应用提供了starter,更方便快捷的调用。
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors2
Uh oh!
There was an error while loading.Please reload this page.