最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、Redisson分布式鎖概述 ??

?? 1.1 分布式鎖的意義

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

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

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

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

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

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

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

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

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

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

?? 2.4 鎖的釋放

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

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

?? 3.1 參數(shù)說明

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

  • leaseTime: 表示鎖的持有時(shí)間,即鎖在自動(dòng)釋放之前可以保持多久。

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

?? 3.2 舉例幾個(gè)常見的方法

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

	// 沒設(shè)置leaseTime,有看門狗機(jī)制
	lock.tryLock();
	// 實(shí)際調(diào)用的RedissonLock的tryLock(long waitTime, TimeUnit unit) 
	// 沒設(shè)置leaseTime,有看門狗機(jī)制
	lock.tryLock(3, TimeUnit.SECONDS); 
	// 實(shí)際調(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)會(huì)有看門狗機(jī)制,因?yàn)闆]有設(shè)置過期時(shí)間,默認(rèn)是30s過期,但是看門狗每10s續(xù)期一次,每次續(xù)期都重新設(shè)置過期時(shí)間為30s。如果沒有釋放鎖,理論上會(huì)無限續(xù)期。

?? 3.4 tryLock(long waitTime, TimeUnit unit)

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

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

?? 3.5 lock(long leaseTime, TimeUnit unit)

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

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

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

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

相關(guān)文章

  • Redis緩存-序列化對(duì)象存儲(chǔ)亂碼問題的解決

    Redis緩存-序列化對(duì)象存儲(chǔ)亂碼問題的解決

    這篇文章主要介紹了Redis緩存-序列化對(duì)象存儲(chǔ)亂碼問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺談一下Redis的數(shù)據(jù)結(jié)構(gòu)

    淺談一下Redis的數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了淺談一下Redis的數(shù)據(jù)結(jié)構(gòu),簡單字符串結(jié)構(gòu)被用于存儲(chǔ)redis的key對(duì)象和String類型的value對(duì)象,其中的free和len字段可以輕松的使得在該字符串被修改時(shí)判斷是否需要擴(kuò)容,需要的朋友可以參考下
    2023-08-08
  • Redis 集群搭建和簡單使用教程

    Redis 集群搭建和簡單使用教程

    集群技術(shù)是構(gòu)建高性能網(wǎng)站架構(gòu)的重要手段,下面這篇文章主要介紹了Redis 集群搭建和簡單使用教程,文中通過示例代碼和圖片介紹的很想,對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來一起看看吧。
    2017-02-02
  • Java Socket實(shí)現(xiàn)Redis客戶端的詳細(xì)說明

    Java Socket實(shí)現(xiàn)Redis客戶端的詳細(xì)說明

    socket編程是一門技術(shù),它主要是在網(wǎng)絡(luò)通信中經(jīng)常用到.這篇文章主要介紹了如何用Java Socket實(shí)現(xiàn)一個(gè)簡單的Redis客戶端,需要的朋友可以參考下
    2021-05-05
  • Redis數(shù)據(jù)導(dǎo)出之多文件輸出與編碼問題的完整解決方案

    Redis數(shù)據(jù)導(dǎo)出之多文件輸出與編碼問題的完整解決方案

    Python作為數(shù)據(jù)處理的重要工具,結(jié)合Redis模塊可以輕松實(shí)現(xiàn)這一功能,然而,在實(shí)際操作過程中會(huì)出現(xiàn)多文件輸出混亂和字符編碼錯(cuò)誤,下面我們來看看具體的解決方法吧
    2025-08-08
  • Redis?使用?List?實(shí)現(xiàn)消息隊(duì)列的優(yōu)缺點(diǎn)

    Redis?使用?List?實(shí)現(xiàn)消息隊(duì)列的優(yōu)缺點(diǎn)

    這篇文章主要介紹了Redis?使用?List?實(shí)現(xiàn)消息隊(duì)列有哪些利弊,小編結(jié)合消息隊(duì)列的特點(diǎn)一步步帶大家分析使用?Redis?的?List?作為消息隊(duì)列的實(shí)現(xiàn)原理,并分享如何把?SpringBoot?與?Redission?整合運(yùn)用到項(xiàng)目中,需要的朋友可以參考下
    2022-01-01
  • Redis持久化AOF示例詳解

    Redis持久化AOF示例詳解

    AOF(Append-Only?File)用于將Redis服務(wù)器收到的寫操作追加到日志文件,通過該機(jī)制可以保證服務(wù)器重啟后依然可以依靠日志文件恢復(fù)數(shù)據(jù),這篇文章主要介紹了Redis持久化AOF詳解,需要的朋友可以參考下
    2023-12-12
  • redis?for?windows?6.2.6安裝包最新步驟詳解

    redis?for?windows?6.2.6安裝包最新步驟詳解

    這篇文章主要介紹了redis?for?windows?6.2.6安裝包全網(wǎng)首發(fā),使用Windows計(jì)劃任務(wù)自動(dòng)運(yùn)行redis服務(wù),文章給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 詳解Redis中的簡單動(dòng)態(tài)字符串和C字符串的區(qū)別

    詳解Redis中的簡單動(dòng)態(tài)字符串和C字符串的區(qū)別

    簡單動(dòng)態(tài)字符串(SDS)和?C?字符串在實(shí)現(xiàn)和特性上存在一些區(qū)別,這些區(qū)別使得?SDS?更適合作為?Redis?中字符串對(duì)象的內(nèi)部表示,本文給大家介紹一下Redis中的簡單動(dòng)態(tài)字符串和C字符串的區(qū)別,需要的朋友可以參考下
    2023-12-12
  • 關(guān)于Redis數(shù)據(jù)持久化的概念介紹

    關(guān)于Redis數(shù)據(jù)持久化的概念介紹

    Redis是內(nèi)存數(shù)據(jù)庫,數(shù)據(jù)都是存儲(chǔ)在內(nèi)存中,需要定期將Redis中的數(shù)據(jù)以某種形式(或命數(shù)據(jù)令)從內(nèi)存保存到硬盤,今天給大家分享Redis數(shù)據(jù)的持久化的概念介紹,需要的朋友參考下吧
    2021-08-08

最新評(píng)論

高州市| 武威市| 云阳县| 华阴市| 抚顺市| 周至县| 温泉县| 郴州市| 石家庄市| 永仁县| 额尔古纳市| 三门县| 宣汉县| 临泽县| 阿克| 宣化县| 沁源县| 上高县| 许昌县| 定陶县| 广宁县| 日照市| 新田县| 双桥区| 镇雄县| 黄龙县| 犍为县| 乐业县| 团风县| 中方县| 兰考县| 磴口县| 宁夏| 五寨县| 昌宁县| 忻城县| 南澳县| 衡水市| 本溪| 宝鸡市| 孝昌县|