redisson watchdog机制
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秒。
以上是我通过试验和官方文档的介绍,结合自己的理解的总结文。
参考文献
转载自:https://juejin.cn/post/6940530504273756191