• 8.4. 红锁(RedLock)

    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();