Redisson 分佈式鎖源碼 02:看門狗

前言

提及 Redisson,比較耳熟能詳的就是這個看門狗(Watchdog)機制。redis

本文就一塊兒看看加鎖成功以後的看門狗(Watchdog)是如何實現的?異步

加鎖成功

在前一篇文章中介紹了可重入鎖加鎖的邏輯,其中 RedissonLock#tryAcquireAsync 方法是進行異步加鎖的邏輯。分佈式

回顧一下這個方法的入參:ui

  1. waitTime:-1;
  2. leaseTime:-1,加鎖時未指定鎖時間,則爲 -1,若是指定,則是指定的時間;
  3. unit:null;
  4. threadId:當前線程 id。

其中的 tryLockInnerAsync 在以前已經介紹過了。lua

當加鎖成功時,會返回 null,加鎖失敗,會返回當前鎖的剩餘時間。spa

因此這塊會進入到紅框標記的部分。線程

leaseTime 爲加鎖時間,默認不指定,因此會進入到 scheduleExpirationRenewal 方法,也就是今天的主題:看門狗。code

至此能夠得出一個結論:遞歸

Redisson 看門狗(Watchdog)在指定加鎖時間時,是不會對鎖時間自動續租的。事務

看門狗

看門狗的一部分重點邏輯就在 renewExpiration 方法這裏:

  1. 延遲調度,延遲時間爲:internalLockLeaseTime / 3,就是 10s 左右後會調度這個 TimerTask;
  2. 異步續租:邏輯都在 renewExpirationAsync 裏面;
  3. 遞歸調用:當續租成功以後,從新調用 renewExpiration 本身,從而達到持續續租的目的;
  4. 固然也不能一直無限續租,因此中間有一些判斷邏輯,就是用來中斷續租的。

續租邏輯

這塊也是一個 lua 腳本,就是將以前的 redis key 直接從新設置時間。

這樣一通續租下來,就是在過了 10s 左右將鎖的時間從新設置爲 30s

總結

至此,看門狗介紹完畢,簡要總結一下內容。

  1. 只有在未指定鎖超時時間時纔會使用看門狗;
  2. 看門狗默認續租時間是 10s 左右,internalLockLeaseTime / 3
  3. 能夠經過 Config 統一設置看門狗的時間,設置 lockWatchdogTimeout 參數便可。

最後,一樣使用一張圖,進行下總結:

相關推薦

相關文章
相關標籤/搜索