redission为我们提供了方便使用redis集群的方法,可以使用它完成锁的建立。
依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.36.0</version>
</dependency>
spring引用
package com.hmdp.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedisConfig {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379").setPassword("");
return Redisson.create(config);
}
}
可重用锁原理
redisson的可重用锁,通过redis的hash实现,value保存重用值。 通过lua脚本实现获取和释放锁。 获取锁:
释放锁:
锁重试以及watchdog原理
获取锁
首先获取根据有没有leasetime,如果没有设置watchdogtime=30秒,然后去获取锁,如果获取到了,直接返回true,如果没有获取到,则根据等待时间来判断是否继续,如果已经超出等待时间,则直接返回,没有运行订阅方法,来查询当前锁还有多久ttl,根据目前剩余等待时间,如果小于ttl,则重新运行获取锁方法,else则false发走。
释放锁:
比较简单,这里不叙述
watchdog:
在设置无leasetime时,redisson会自动填充为watchdogtime的30秒,并且执行一个异步任务,每次都将锁的ttl重置为30秒。
multiLock
使用redis的主从策略,如果主机宕机的话,可能出现数据不一致的问题,而redisson的multiLock为我们提供了解决方法,它保证了不同redis的原子性,只需要在声明注入即可。
评论前必须登录!
注册