- Redisson介绍
- redisson入门
- 使用redisson的分布式锁
- 图解Redisson可重入原理 及对应lua脚本
- redisson分布式锁原理
- 总结
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data
Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。
官网地址: https://redisson.org
GitHub地址: https://github.com/redisson/redisson
@Configuration
public class RedisConfig {
@Bean
public RedissonClient redissonClient(){
//配置类
Config config = new Config();
//添加redis地址,这里加的单点地址,也可使用config.useClusterServers()添加集群地址
config.useSingleServer().setAddress("redis://192.168.136.130:6379").setPassword("123321");
//创建客户端
return Redisson.create(config);
}
}
//引入依赖
org.redisson
redisson
3.13.2
使用redisson的分布式锁
@Test
void testRedisson() throws InterruptedException {
// 获取锁(可重入),指定锁的名称
RLock lock = redissonClient.getLock("anyLock");
// 尝试获取锁,参数分别是:获取锁的最大等待时间(期间会重试),锁自动释放时间,时间单位
boolean isLock = lock.tryLock(1, 10, TimeUnit.SECONDS);
// 判断释放获取成功
if(isLock){
try {
System.out.println("执行业务");
} finally {
// 释放锁
lock.unlock();
}
}
}
图解Redisson可重入原理 及对应lua脚本
1: 可重入,利用hash结构记录id和重入次数
2: 可重试:利用信号量和pubSub功能实现等待、唤醒,获取锁失败的重试机制
3: 超时续约:利用看门狗watchDog,每隔一段时间(releasTime/3),重置超时时间
不可重入Redis分布式锁:
原理:利用setnx的互斥性;利用ex避免死锁;释放锁时判断线程标示
缺陷:不可重入、无法重试、锁超时失效
2)可重入的Redis分布式锁:
原理:利用hash结构,记录线程标示和重入次数;利用watchDog延续锁时间;利用信号量控制锁重试等待
缺陷:redis宕机引起锁失效问题
3)Redisson的multiLock:
原理:多个独立的Redis节点,必须在所有节点都获取重入锁,才算获取锁成功
缺陷:运维成本高、实现复杂



