Redisson 分布式鎖源碼之二:看門狗
前言
說起 Redisson,比較耳熟能詳的就是這個看門狗(Watchdog)機制。
本文就一起看看加鎖成功之后的看門狗(Watchdog)是如何實現的?
1加鎖成功
在前一篇文章中介紹了可重入鎖加鎖的邏輯,其中 RedissonLock#tryAcquireAsync 方法是進行異步加鎖的邏輯。
回顧一下這個方法的入參:
- waitTime:-1;
- leaseTime:-1,加鎖時未指定鎖時間,則為 -1,如果指定,則是指定的時間;
- unit:null;
- threadId:當前線程 id。
其中的 tryLockInnerAsync 在之前已經介紹過了。
當加鎖成功時,會返回 null,加鎖失敗,會返回當前鎖的剩余時間。
所以這塊會進入到紅框標記的部分。
leaseTime 為加鎖時間,默認不指定,所以會進入到 scheduleExpirationRenewal 方法,也就是今天的主題:看門狗。
至此可以得出一個結論:
Redisson 看門狗(Watchdog)在指定加鎖時間時,是不會對鎖時間自動續租的。
2看門狗
看門狗的一部分重點邏輯就在 renewExpiration 方法這里:
- 延遲調度,延遲時間為:internalLockLeaseTime / 3,就是 10s 左右后會調度這個 TimerTask;
- 異步續租:邏輯都在 renewExpirationAsync 里面;
- 遞歸調用:當續租成功之后,重新調用 renewExpiration 自己,從而達到持續續租的目的;
- 當然也不能一直無限續租,所以中間有一些判斷邏輯,就是用來中斷續租的。
續租邏輯
這塊也是一個 lua 腳本,就是將之前的 redis key 直接重新設置時間。
這樣一通續租下來,就是在過了 10s 左右將鎖的時間重新設置為 30s。
3總結
至此,看門狗介紹完畢,簡要總結一下內容。
只有在未指定鎖超時時間時才會使用看門狗;
看門狗默認續租時間是 10s 左右,internalLockLeaseTime / 3;
可以通過 Config 統一設置看門狗的時間,設置 lockWatchdogTimeout 參數即可。
最后,同樣使用一張圖,進行下總結:
本文轉載自微信公眾號「程序員小航」,可以通過以下二維碼關注。轉載本文請聯系程序員小航公眾號。