前言说起Redisson,大家比较熟悉的就是Watchdog机制。本文就来看看加锁成功后看门狗(Watchdog)是如何实现的?1加锁成功上一篇介绍了可重入锁加锁的逻辑,RedissonLock#tryAcquireAsync方法是异步加锁逻辑。查看该方法的入参:waitTime:-1;leaseTime:-1,如果加锁时没有指定加锁时间,则为-1,如果指定,则为指定时间;单位:无;threadId:当前线程id。其中,之前介绍过tryLockInnerAsync。加锁成功时,返回null;如果加锁失败,则返回当前加锁的剩余时间。所以这块会进入红框标记的部分。leaseTime是锁定时间,默认不指定,所以会进入scheduleExpirationRenewal方法,也就是今天的话题:watchdog。至此可以得出一个结论:当Redisson看门狗(Watchdog)指定锁时间后,不会自动续租锁时间。2、看门狗watchdog的部分关键逻辑在renewExpiration方法中:延迟调度,延迟时间为:internalLockLeaseTime/3,表示大约10s后会调度TimerTask;异步续租:逻辑都在renewExpirationAsync;递归调用:当续租成功时,调用renewExpiration本身,达到不断续租的目的;当然租约不可能无限期续租,所以中间有一些判断逻辑,用来中断租约续租。续租逻辑也是一个lua脚本,就是直接重置之前的rediskey的时间。这样,续租就是在10s左右后重新设置锁时间为30s。3小结至此,看门狗的介绍就结束了,对内容做一个简单的小结。看门狗只有在没有指定锁超时时间时才会使用;看门狗默认续租时间约为10s,internalLockLeaseTime/3;看门狗的时间可以通过Config统一设置,设置lockWatchdogTimeout参数即可。最后,我也用一张图做如下总结:本文转载自微信公众号“程序员小航”,可通过以下二维码关注。转载本文请联系程序员小航公众号。
