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节点,必须在所有节点都获取重入
锁,才算获取锁成功
◆缺陷:运维成本高、实现复杂
标签:Redisson,lock,lock2,lock3,lock1,加锁,RedissonMultiLock,主从,分布式 From: https://blog.51cto.com/AmbitionGarden/8026247