redisson watchdog机制

2,450 阅读1分钟

redisson watchdog机制

public Object test() {
        RLock lock = redisson.getLock("my-lock");
        boolean b = false;
        try {
//            b = lock.tryLock(20, 10, TimeUnit.SECONDS); //①
            b = lock.tryLock(40, TimeUnit.SECONDS); //②
            if (b) {
                System.out.println("线程:" + Thread.currentThread().getName() + " 已上锁");
                System.err.println(Thread.currentThread().getName() + " 的任务开始执行......");
                Thread.sleep(100000);
                System.err.println(Thread.currentThread().getName() + " 的任务执行完毕。");
            } else {
                System.out.println("线程:" + Thread.currentThread().getName() + " 没上锁");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println("线程:" + Thread.currentThread().getName() + " 释放锁......");
            if (b) {
                lock.unlock();
                System.out.println("线程:" + Thread.currentThread().getName() + " 释放锁完毕。");
            }
        }
        return b;
    }
  • internalLockLeaseTime也就是形参leaseTime没有设置,默认30秒,且开启watchdog,每过10秒做一次续约直到线程任务跑完位置,才释放锁,就像情况②,它只设置了加锁等待超时时间,没有设置持有锁的时间,当任务超过默认三十秒还未执行完,此时watchdog机制会一直续约直到任务完成位置,每十秒将时间重置为30秒。

  • 情况①则是到指定的锁超时时间10秒,还未完成任务,也会释放锁,watchdog不会启动。

  • 还有一种情况是Redisson死锁问题,其实Redisson本身不会造成死锁,因为它在给一个线程加锁(给缓存设置key)的时候,默认会有一个超时时间,所以即便是服务挂了,key也会到时间自动删除,leaseTime没有设置则为-1,就会自动获取配置参数里面的Config.lockWatchdogTimeout的值,默认为30秒。

以上是我通过试验和官方文档的介绍,结合自己的理解的总结文。

参考文献

Redisson 官方文档