提及 Redisson,比較耳熟能詳的就是這個看門狗(Watchdog)機制。redis
本文就一塊兒看看加鎖成功以後的看門狗(Watchdog)是如何實現的?異步
在前一篇文章中介紹了可重入鎖加鎖的邏輯,其中 RedissonLock#tryAcquireAsync
方法是進行異步加鎖的邏輯。分佈式
回顧一下這個方法的入參:ui
其中的 tryLockInnerAsync
在以前已經介紹過了。lua
當加鎖成功時,會返回 null,加鎖失敗,會返回當前鎖的剩餘時間。spa
因此這塊會進入到紅框標記的部分。線程
leaseTime 爲加鎖時間,默認不指定,因此會進入到 scheduleExpirationRenewal
方法,也就是今天的主題:看門狗。code
至此能夠得出一個結論:遞歸
Redisson 看門狗(Watchdog)在指定加鎖時間時,是不會對鎖時間自動續租的。事務
看門狗的一部分重點邏輯就在 renewExpiration
方法這裏:
internalLockLeaseTime / 3
,就是 10s 左右後會調度這個 TimerTask;renewExpiration
本身,從而達到持續續租的目的;這塊也是一個 lua 腳本,就是將以前的 redis key 直接從新設置時間。
這樣一通續租下來,就是在過了 10s 左右將鎖的時間從新設置爲 30s。
至此,看門狗介紹完畢,簡要總結一下內容。
internalLockLeaseTime / 3
;lockWatchdogTimeout
參數便可。最後,一樣使用一張圖,進行下總結: