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