Apong's Blog

当你快坚持不住的时候,困难也快坚持不住了

0%

Redisson分布式锁、联锁

Redisson

使用步骤

  1. 引入依赖
1
2
3
4
5
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.6</version>
</dependency>
  1. 配置 RedissonClient
1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
// 配置redis地址
config.useSingleServer()
.setAddress("redis://192.168.59.128:6379")
.setPassword("123321");
// 创建redisson客户端
return Redisson.create(config);
}
}
  1. 获取锁
1
2
3
RLock lock = RedissonClient.getLock("order");
lock.tryLock();
lock.unlock();

原理分析

  1. 可重入

    将存储结构改为 Hash 类型,field 为线程标识,value 为重入次数,记录锁重入的次数并每次重入刷新有效期。

    释放锁的时候判断是否重入次数变为0,否则-1

  2. 可重试

    允许设置 waitTime,在等待时间范围内不断重新获取锁

  3. 超时释放

    设立 watchdog 任务机制,只要服务还在进行就不停续约,如果服务宕机就会过期释放

  4. 联锁

    允许使用多个 Redis 节点,必须在所有节点获取到锁才算成功,如果有一个节点宕机即使主从不一致,也无法从一个节点就获取到锁。