8.4. 红锁(RedLock)

基于Redis的Redisson红锁RedissonRedLock对象实现了Redlock介绍的加锁算法。该对象也可以用来将多个RLock对象关联为一个红锁,每个RLock对象实例可以来自于不同的Redisson实例。

  1. RLock lock1 = redissonInstance1.getLock("lock1");
  2. RLock lock2 = redissonInstance2.getLock("lock2");
  3. RLock lock3 = redissonInstance3.getLock("lock3");
  4. RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
  5. // 同时加锁:lock1 lock2 lock3
  6. // 红锁在大部分节点上加锁成功就算成功。
  7. lock.lock();
  8. ...
  9. lock.unlock();

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

另外Redisson还通过加锁的方法提供了leaseTime的参数来指定加锁的时间。超过这个时间后锁便自动解开了。

  1. RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
  2. // 给lock1,lock2,lock3加锁,如果没有手动解开的话,10秒钟后将会自动解开
  3. lock.lock(10, TimeUnit.SECONDS);
  4. // 为加锁等待100秒时间,并在加锁成功10秒钟后自动解开
  5. boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
  6. ...
  7. lock.unlock();