0
点赞
收藏
分享

微信扫一扫

Redisson分布式锁主从一致性问题解决

Redis联锁

联锁(RedissonMultiLock)对象可以将多个RLock对象关联为一个联锁,实现加锁和解锁功能。每个RLock对象实例可以来自于不同的Redisson实例。

如果负责储存分布式锁的某些Redis节点宕机以后,而且这些锁正好处于锁住状态,就会出现死锁问题。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗。看门狗的作用是在Redisson实例被关闭前,不断延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒,也可以通过修改Config.lockWatchdogTimeout来另行指定。

RLock lock1 = redissonClient1.getLock("lock1");
RLock lock2 = redissonClient2.getLock("lock2");
RLock lock3 = redissonClient3.getLock("lock3");

RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
// 同时加锁:lock1 lock2 lock3
// 所有的锁都上锁成功才算成功。
lock.lock();
...
lock.unlock();

RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
// 给lock1,lock2,lock3加锁,如果没有手动解开的话,(leaseTime=10s)10秒钟后将会自动解开
lock.lock(10, TimeUnit.SECONDS);

// 为加锁等待(waitTime=100s)100秒时间,并在加锁成功10秒钟后自动解开
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();

总结:

1 )不可重入Redis分布式锁:

◆原理:利用setnx的互斥性;

利用ex避免死锁;

释放锁时判断线程标示

缺陷:不可重入、无法重试、锁超时失效

2)可重入的Redis分布式锁:

◆原理:利用hash结构,记录线程标示和重入次数;

利用watchDog延续锁时间;

利用信号量控制锁重试等待

◆缺陷: redis宕机引起锁失效问题

3) Redisson的multilock:

◆原理:多个独立的Redis节点,必须在所有节点都获取重入

锁,才算获取锁成功

◆缺陷:运维成本高、实现复杂

举报

相关推荐

0 条评论