9. 緩存Redis 分布式鎖的續(xù)期

Redis分布式鎖比較正確的姿勢是采用redisson這個客戶端工具。

可重入鎖(Reentrant Lock)

基于Redis的Redisson分布式可重入鎖RLock。

public class DemoMain {
    public static void main(String[] args) throws Exception {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");

        RedissonClient redisson = Redisson.create(config);
        RLock lock = redisson.getLock("anyLock");

        lock.lock();
        ...
        //lock.unlock();
    }
}

問題分析 Redisson節(jié)點宕機&鎖續(xù)期

鎖超時-節(jié)點宕機

如果負責存儲分布式的Redisson節(jié)點宕機,而且這個鎖正好處于上鎖的狀態(tài)時,那么就會出現(xiàn)我們所謂的死鎖的狀態(tài)。但是為了避免這種情況的發(fā)生,Redisson內(nèi)部已經(jīng)提供了一種機制??赏ㄟ^Redisson通過加鎖的方式提供了leaseTime的參數(shù)來指定加鎖的時間,超過這個時間這個鎖就自動解開了。

鎖續(xù)期-節(jié)點宕機

Redisson內(nèi)部已經(jīng)提供了一種機制,LockWatchDog(看門狗) 即提供了一個監(jiān)控鎖的看門狗,它的作用是在Redisson實例被關閉前,不斷的延長鎖的有效期。默認情況下,看門狗檢查鎖超時時間的間隔為30秒,這個時間可通過Config.lockWatchDogTimeout來進行指定。

Redisson.create(config);

redisson-lock1

通過源碼:internalLockLeaseTimelockWatchdogTimeout這兩個參數(shù)是相等的.
lockWatchdogTimeout默認值如下

public class Config {
    private long lockWatchdogTimeout = 30 * 1000;
    public long getLockWatchdogTimeout() {
       return lockWatchdogTimeout;
    }
    //...
}

internalLockLeaseTime:分布式鎖的超時時間默認是30秒.
看門狗,多久來延長一次有效期呢?

redisson-lock

即:獲取鎖成功就會開啟一個定時任務,也就是watchdog,定時任務會定期檢查去續(xù)期renewExpirationAsync(threadId).
這里定時用的是netty-common包中的HashedWheelTimer,該定時調(diào)度每次調(diào)用的時間差是internalLockLeaseTime / 3.也就10秒.

總結(jié)

默認情況下,加鎖的時間是30秒.如果加鎖的業(yè)務沒有執(zhí)行完,那么到 30-10 = 20秒的時候,就會進行一次續(xù)期,把鎖重置成30秒.那這個時候可能又有同學問了,那業(yè)務的機器萬一宕機了呢?宕機了定時任務跑不了,就續(xù)不了期,那自然30秒之后鎖就解開了.

注:內(nèi)容總結(jié)于肥朝微信公眾號,在此只是當做學習筆記-非原創(chuàng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容