亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入解析Redisson分布式鎖看門狗機(jī)制

 更新時間:2025年06月10日 09:06:51   作者:一個搬磚的農(nóng)民工  
本文主要介紹了深入解析Redisson分布式鎖看門狗機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、Redisson分布式鎖概述 ??

?? 1.1 分布式鎖的意義

在分布式系統(tǒng)中,多個節(jié)點可能同時訪問共享資源,導(dǎo)致數(shù)據(jù)不一致或競態(tài)條件。分布式鎖通過協(xié)調(diào)不同節(jié)點對共享資源的訪問,確保數(shù)據(jù)的一致性和并發(fā)訪問的安全性。

?? 1.2 Redisson分布式鎖的優(yōu)勢

  • 基于Redis實現(xiàn):Redis作為高性能的內(nèi)存數(shù)據(jù)庫,提供了快速、穩(wěn)定的存儲服務(wù),為Redisson分布式鎖提供了堅實的基礎(chǔ)。
  • 豐富的API:Redisson提供了豐富的Java API,使得分布式鎖的使用更加簡單、直觀。
  • 自動續(xù)期機(jī)制:Redisson的分布式鎖支持自動續(xù)期,避免了因業(yè)務(wù)處理時間過長導(dǎo)致的鎖過期問題。
  • 可重入鎖:Redisson的分布式鎖支持可重入特性,即同一個線程可以多次獲取同一把鎖。

二、Redisson分布式鎖的原理 ??

?? 2.1 鎖的實現(xiàn)方式

Redisson分布式鎖主要基于Redis的SETNX(Set if Not Exists)命令和DEL(Delete)命令實現(xiàn)。SETNX命令嘗試設(shè)置一個值,如果該鍵不存在,則設(shè)置成功并返回1;否則返回0。DEL命令則用于刪除一個鍵。

?? 2.2 看門狗機(jī)制

  • Redisson通過看門狗(Watch Dog)機(jī)制來實現(xiàn)鎖的自動續(xù)期。當(dāng)一個沒有 leaseTime線程獲取鎖后,Redisson會立即啟動一個后臺的定時任務(wù)(看門狗)來定期檢查鎖的狀態(tài)。
  • 看門狗的時間間隔通常是鎖默認(rèn)過期時間(如30秒)的三分之一(即10秒)。
  • 如果線程在鎖的默認(rèn)過期時間內(nèi)完成了操作并釋放了鎖,看門狗會檢測到鎖的釋放并取消該定時任務(wù),避免不必要的資源消耗。
  • 看門狗機(jī)制只會針對沒有設(shè)置 leaseTime 的鎖;設(shè)置了 leaseTime 的鎖不會有看門狗機(jī)制,會根據(jù)設(shè)置的過期時間自然過期。
  • 看門狗是由redisson維護(hù)的,當(dāng)java服務(wù)進(jìn)程中斷時,看門狗也會中斷,redis鎖將自然過期。

?? 2.3 鎖的自動續(xù)期機(jī)制

  • 每當(dāng)觸發(fā)看門狗機(jī)制時,它會嘗試自動續(xù)期,續(xù)期的時間長度通常是鎖的默認(rèn)過期時間(如再次設(shè)置為30秒),但也可以根據(jù)具體需求進(jìn)行調(diào)整。

?? 2.4 鎖的釋放

當(dāng)一個線程完成臨界區(qū)的操作后,應(yīng)當(dāng)手動釋放鎖。在Redisson中,這通常通過調(diào)用unlock()方法來完成。如果線程沒有手動釋放鎖,而是異常結(jié)束或被其他方式中斷,Redis的鍵空間通知功能可以確保鎖在一段時間后自動釋放。

三、Redisson 看門狗機(jī)制 ??

?? 3.1 參數(shù)說明

  • waitTime: 表示在嘗試獲取鎖之前,線程會等待多長時間(前提:鎖被占用)。當(dāng)waitTime設(shè)置為大于0的值時,線程在嘗試獲取鎖時會在指定的時間內(nèi)等待。如果在這段時間內(nèi)鎖沒有被獲取到,tryLock方法將返回false。

  • leaseTime: 表示鎖的持有時間,即鎖在自動釋放之前可以保持多久。

  • unit: 時間單位,用于指定waitTime和leaseTime的時間單位。

?? 3.2 舉例幾個常見的方法

	RLock lock = redissonClient.getLock("lockKey001");

	// 沒設(shè)置leaseTime,有看門狗機(jī)制
	lock.tryLock();
	// 實際調(diào)用的RedissonLock的tryLock(long waitTime, TimeUnit unit) 
	// 沒設(shè)置leaseTime,有看門狗機(jī)制
	lock.tryLock(3, TimeUnit.SECONDS); 
	// 實際調(diào)用的RedissonLock的lock(long leaseTime, TimeUnit unit)方法
	// 設(shè)置了leaseTime,沒有看門狗機(jī)制
	lock.lock(10, TimeUnit.SECONDS);
	// 設(shè)置了leaseTime=10s,沒有看門狗機(jī)制
	lock.tryLock(3,10, TimeUnit.SECONDS);

?? 3.3 tryLock()

tryLock() 方法默認(rèn)會有看門狗機(jī)制,因為沒有設(shè)置過期時間,默認(rèn)是30s過期,但是看門狗每10s續(xù)期一次,每次續(xù)期都重新設(shè)置過期時間為30s。如果沒有釋放鎖,理論上會無限續(xù)期。

?? 3.4 tryLock(long waitTime, TimeUnit unit)

// 源碼
 public boolean tryLock(long waitTime, TimeUnit unit) throws InterruptedException {
        return this.tryLock(waitTime, -1L, unit);
    }

因為這個方法沒有設(shè)置 leaseTime,因此默認(rèn)也是有看門狗機(jī)制的。默認(rèn)是30s過期,但是看門狗每10s續(xù)期一次,每次續(xù)期都重新設(shè)置過期時間為30s。如果沒有釋放鎖,理論上會無限續(xù)期。

?? 3.5 lock(long leaseTime, TimeUnit unit)

設(shè)置了 leaseTime 不會有看門狗機(jī)制

 // 源碼
 public void lock(long leaseTime, TimeUnit unit) {
        try {
            this.lockInterruptibly(leaseTime, unit);
        } catch (InterruptedException var5) {
            Thread.currentThread().interrupt();
        }
    }

?? 3.6 tryLock(long waitTime, long leaseTime, TimeUnit unit)

設(shè)置了 leaseTime 不會有看門狗機(jī)制

// 源碼
public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {
	long time = unit.toMillis(waitTime);
	long current = System.currentTimeMillis();
	...........
}

四、其他 ??

?? 4.1 看門狗生命周期

當(dāng)一個沒有設(shè)置leaseTime 的鎖一創(chuàng)建 Redisson 就會生成一個對應(yīng)的看門狗,如果執(zhí)行了unlock()則看門狗會一起銷毀。不然會直到j(luò)ava進(jìn)程終止(重啟、銷毀)才會消失。

?? 4.2 看門狗是Redisson 生成的嗎

是的,看門狗機(jī)制是Redisson 后臺啟的一個定時任務(wù),不是Redis自帶的。

到此這篇關(guān)于深入解析Redisson分布式鎖看門狗機(jī)制的文章就介紹到這了,更多相關(guān)Redisson分布式鎖看門狗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis基本數(shù)據(jù)類型哈希Hash常用操作命令

    Redis基本數(shù)據(jù)類型哈希Hash常用操作命令

    這篇文章主要為大家介紹了Redis基本數(shù)據(jù)類型哈希Hash常用操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Redis?常見緩存問題總結(jié)

    Redis?常見緩存問題總結(jié)

    這篇文章主要給大家總結(jié)了一些Redis?常見緩存問題,并介紹了解決辦法,文中的圖文示例介紹的非常仔細(xì),感興趣的同學(xué)可以參考閱讀下
    2023-06-06
  • React中immutable的使用

    React中immutable的使用

    這篇文章主要介紹了React中immutable的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • redis由于目標(biāo)計算機(jī)積極拒絕,無法連接的解決

    redis由于目標(biāo)計算機(jī)積極拒絕,無法連接的解決

    這篇文章主要介紹了redis由于目標(biāo)計算機(jī)積極拒絕,無法連接的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Redis序列化反序列化不一致導(dǎo)致String類型值多了雙引號問題

    Redis序列化反序列化不一致導(dǎo)致String類型值多了雙引號問題

    這篇文章主要介紹了Redis序列化反序列化不一致導(dǎo)致String類型值多了雙引號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Redis 實現(xiàn)隊列原理的實例詳解

    Redis 實現(xiàn)隊列原理的實例詳解

    這篇文章主要介紹了Redis 實現(xiàn)隊列原理的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案

    Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案

    兩級緩存Redis+Caffeine可以解決緩存雪等問題也可以提高接口的性能,但是可能會出現(xiàn)緩存一致性問題,如果數(shù)據(jù)頻繁的變更,可能會導(dǎo)致Redis和Caffeine數(shù)據(jù)不一致的問題,所以本文給大家介紹了Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案,需要的朋友可以參考下
    2024-12-12
  • Redis的雙寫問題解決

    Redis的雙寫問題解決

    本文主要介紹了Redis的雙寫問題解決,這種問題在使用 Redis 作為緩存層時尤為常見,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Win10配置redis服務(wù)實現(xiàn)過程詳解

    Win10配置redis服務(wù)實現(xiàn)過程詳解

    這篇文章主要介紹了Win10配置redis服務(wù)實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • python腳本實現(xiàn)Redis未授權(quán)批量提權(quán)

    python腳本實現(xiàn)Redis未授權(quán)批量提權(quán)

    這篇文章主要給大家介紹了關(guān)于利用python腳本實現(xiàn)redis未授權(quán)批量提權(quán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評論