官方地址
官网: https://redisson.org
github: https://github.com/redisson/redisson
基于setnx实现的分布式锁存在的问题
redisson分布式锁原理
- 不可重入: 利用hash结构记录线程id和重入次数
- 不可重试: 利用信号量和PubSub功能实现等待、唤醒, 获取锁失败的重试机制
- 超时释放: 利用WatchDog, 每隔一段时间(releaseTime/3), 重置超时时间
依赖和配置
- 引入依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency>
- 配置
@Beanpublic RedissonClient redissonClient(){Config config = new Config();// 添加redis地址, 这里添加了单点的地址, 也可以用config.useClusterServers()添加集群地址config.useSingleServer().setAddress("redis://localhost:6379").setPassword("123456");return Redisson.create(config);}
- 三台单点redis服务
@Beanpublic RedissonClient redissonClient(){Config config = new Config();// 添加redis地址, 这里添加了单点的地址, 也可以用config.useClusterServers()添加集群地址config.useSingleServer().setAddress("redis://localhost:6379").setPassword("123456");return Redisson.create(config);}@Beanpublic RedissonClient redissonClient2(){Config config = new Config();// 添加redis地址, 这里添加了单点的地址, 也可以用config.useClusterServers()添加集群地址config.useSingleServer().setAddress("redis://localhost:6380").setPassword("123456");return Redisson.create(config);}@Beanpublic RedissonClient redissonClient3(){Config config = new Config();// 添加redis地址, 这里添加了单点的地址, 也可以用config.useClusterServers()添加集群地址config.useSingleServer().setAddress("redis://localhost:6381").setPassword("123456");return Redisson.create(config);}
RLock multiLock;@BeforeEachvoid setUp() {RLock lock = redissonClient.getLock("xiaoyuxia");RLock lock2 = redissonClient2.getLock("xiaoyuxia");RLock lock3 = redissonClient3.getLock("xiaoyuxia");multiLock = redissonClient.getMultiLock(lock, lock2, lock3);}@Testvoid test() throws Exception {boolean b = multiLock.tryLock();try {if (b) {// TODO}} finally {multiLock.unlock();}}