Redisson实现分布式锁源码解析
锁是在执行多线程时用于强行限制资源访问的同步机制,在分布式系统场景下,为了保证多个进程服务对共享资源的读写同步,保证数据的最终一致性,而单机服务的同步锁只能保证在单个服务中多线程的竞争数据安全性,所以需要分布式锁。
分布式锁应该具备的条件:
1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;
2、高可用的获取锁与释放锁;
3、高性能的获取锁与释放锁;
4、具备可重入特性;
5、具备锁失效机制,防止死锁;
6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。
传统的实现方案
1、基于数据库实现分布式锁;
2、基于缓存(Redis等)实现分布式锁;
3、基于Zookeeper实现分布式锁;
redis实现简单分布式锁
实现思路:
(1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
(2)获取锁后,需要对锁进行续命,用定时维护超时时间,比如说的超时时间是30秒,那就每过10s判断改锁是否还持有,持有的话则将时长续为30秒
(3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。
截取的代码如下:
public String deduc3() {
String lockKey = "lock:pro-100";
UUID uuid = UUID.randomUUID();
// 加锁
Boolean lock = redisTemplate.opsForValue().setIfAbsent(lockKey, uuid, 30, TimeUnit.SECONDS);
// 加锁失败
if (!lock) {
return "error_code";
}
// 锁续命
new Thread(()->{
while (true){
if (uuid.equals(redisTemplate.opsForValu