欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA常用分布式鎖Redisson詳解

 更新時(shí)間:2025年05月16日 10:41:52   作者:時(shí)光呢  
Redisson分布式鎖通過Lua腳本的原子性、可重入設(shè)計(jì)、Watchdog 自動(dòng)續(xù)期和Pub/Sub 通知機(jī)制,實(shí)現(xiàn)了高效的分布式鎖管理,本文給大家介紹JAVA常用分布式鎖Redisson詳解,感興趣的朋友一起看看吧

1. 加鎖過程

底層命令與數(shù)據(jù)結(jié)構(gòu)

  • Redis 數(shù)據(jù)結(jié)構(gòu):使用 Hash 結(jié)構(gòu)存儲(chǔ)鎖信息,Key 為鎖名稱,F(xiàn)ield 為客戶端唯一標(biāo)識(shí)(如 UUID + 線程ID),Value 為鎖的重入次數(shù)。
  • Lua 腳本原子性:通過 Lua 腳本在 Redis 中原子性執(zhí)行加鎖邏輯:
 
if (redis.call('exists', KEYS[1]) == 0) then
    redis.call('hincrby', KEYS[1], ARGV[2], 1);
    redis.call('pexpire', KEYS[1], ARGV[1]);
    return nil;
end;
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then
    redis.call('hincrby', KEYS[1], ARGV[2], 1);
    redis.call('pexpire', KEYS[1], ARGV[1]);
    return nil;
end;
return redis.call('pttl', KEYS[1]);
  • 若鎖不存在(exists 為 0)或?qū)儆诋?dāng)前線程(hexists 為 1),則增加重入次數(shù)并刷新過期時(shí)間。
  • 若鎖被其他線程占用,返回鎖的剩余生存時(shí)間(TTL)。

可重入性

同一線程多次獲取鎖時(shí),重入次數(shù)遞增,確保不會(huì)因多次加鎖導(dǎo)致死鎖。

2. 鎖自動(dòng)續(xù)期(Watchdog 機(jī)制)

  • 后臺(tái)線程續(xù)期:加鎖成功后,啟動(dòng)一個(gè) Watchdog 線程(看門狗),定期(默認(rèn)每 10 秒)檢查鎖是否仍被持有。
  • 續(xù)期條件:僅當(dāng)客戶端仍持有鎖且業(yè)務(wù)未完成時(shí),通過 pexpire 命令將鎖的過期時(shí)間重置為初始值(默認(rèn) 30 秒)。
  • 崩潰容錯(cuò):若客戶端崩潰,Watchdog 線程停止,鎖最終因過期自動(dòng)釋放,避免死鎖。

3. 釋放鎖

釋放邏輯

Lua 腳本原子釋放

if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) then
    return nil;
end;
local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1);
if (counter > 0) then
    redis.call('pexpire', KEYS[1], ARGV[2]);
    return 0;
else
    redis.call('del', KEYS[1]);
    redis.call('publish', KEYS[2], ARGV[1]);
    return 1;
end;
return nil;
  • 減少重入次數(shù),若次數(shù)歸零則刪除鎖,并通過 Pub/Sub 通知等待線程。
  • 確保只有鎖的持有者能釋放鎖,避免誤刪。

4. 鎖競(jìng)爭(zhēng)與等待

  • 自旋重試:若鎖被占用,客戶端進(jìn)入循環(huán),間隔性嘗試加鎖。
  • Pub/Sub 訂閱通知:通過訂閱鎖釋放事件(redisChannel),避免頻繁輪詢。當(dāng)鎖釋放時(shí),Redis 發(fā)布消息通知等待線程競(jìng)爭(zhēng)鎖,減少無效請(qǐng)求。

5. 高可用與容錯(cuò) Redis 部署模式

  • 單節(jié)點(diǎn)模式:簡(jiǎn)單但存在單點(diǎn)故障風(fēng)險(xiǎn)。
  • 主從/集群模式:使用 RedissonMultiLock 實(shí)現(xiàn) RedLock 算法(需多個(gè)獨(dú)立 Redis 節(jié)點(diǎn)):
    • 向所有節(jié)點(diǎn)順序申請(qǐng)鎖。
    • 當(dāng)多數(shù)節(jié)點(diǎn)加鎖成功且總耗時(shí)小于鎖超時(shí)時(shí)間時(shí),認(rèn)為加鎖成功。
    • 規(guī)避主從切換導(dǎo)致鎖丟失的問題,但需權(quán)衡性能和一致性。

6. 關(guān)鍵注意事項(xiàng)

  • 業(yè)務(wù)執(zhí)行時(shí)間:業(yè)務(wù)邏輯必須在鎖的過期時(shí)間內(nèi)完成,否則鎖可能提前釋放。
  • 時(shí)鐘同步問題:在 RedLock 中,若 Redis 節(jié)點(diǎn)間時(shí)鐘不同步,可能導(dǎo)致鎖失效。
  • 網(wǎng)絡(luò)延遲:極端情況下,鎖可能被多個(gè)客戶端同時(shí)持有(需結(jié)合業(yè)務(wù)冪等性處理)。

總結(jié)

  • Redisson 分布式鎖通過 Lua 腳本的原子性可重入設(shè)計(jì)、Watchdog 自動(dòng)續(xù)期和 Pub/Sub 通知機(jī)制,實(shí)現(xiàn)了高效的分布式鎖管理。其核心優(yōu)勢(shì)在于:
  • 避免誤刪鎖(僅持有者可釋放)。
  • 支持可重入,適應(yīng)復(fù)雜業(yè)務(wù)邏輯。
  • 自動(dòng)續(xù)期防止業(yè)務(wù)未完成時(shí)鎖過期。
  • 通過 RedLock 支持高可用場(chǎng)景,但需謹(jǐn)慎權(quán)衡一致性與性能。

到此這篇關(guān)于JAVA常用分布式鎖Redisson的文章就介紹到這了,更多相關(guān)java分布式鎖redisson內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用IDEA向Gitee提交SpringBoot項(xiàng)目進(jìn)行遠(yuǎn)程管理

    使用IDEA向Gitee提交SpringBoot項(xiàng)目進(jìn)行遠(yuǎn)程管理

    本文主要介紹了使用IDEA向Gitee提交SpringBoot項(xiàng)目進(jìn)行遠(yuǎn)程管理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 一個(gè)Servlet是如何處理多個(gè)請(qǐng)求的?

    一個(gè)Servlet是如何處理多個(gè)請(qǐng)求的?

    以前我一直以為一個(gè)Servlet只能處理一個(gè)請(qǐng)求,后來發(fā)現(xiàn)是自己太菜了,可以借助攜帶一個(gè)參數(shù)來完成多個(gè)請(qǐng)求的處理,根據(jù)參數(shù)的不同,在核心的service方法中調(diào)用不同的業(yè)務(wù)方法,來實(shí)現(xiàn)處理多個(gè)servlet請(qǐng)求的目的,廢話不多說,直接上代碼,需要的朋友可以參考下
    2021-06-06
  • Java代碼實(shí)現(xiàn)矩形覆蓋實(shí)例

    Java代碼實(shí)現(xiàn)矩形覆蓋實(shí)例

    這篇文章主要介紹了Java代碼實(shí)現(xiàn)矩形覆蓋實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • 盤點(diǎn)SpringBoot中@Async注解的遇到的坑點(diǎn)及解決辦法

    盤點(diǎn)SpringBoot中@Async注解的遇到的坑點(diǎn)及解決辦法

    SpringBoot是一個(gè)流行的Java開發(fā)框架,在異步編程方面,Spring Boot提供了@Async注解,它能夠讓方法異步執(zhí)行,然而,在使用@Async注解時(shí),有一些潛在的坑需要注意,本文將深入探討Spring Boot中使用@Async注解時(shí)可能遇到的8大坑點(diǎn),并提供相應(yīng)的解決方案
    2024-03-03
  • 詳解java 客戶端鏈接不上redis解決方案

    詳解java 客戶端鏈接不上redis解決方案

    這篇文章主要介紹了詳解java 客戶端鏈接不上redis解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換方法代碼

    Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換方法代碼

    這篇文章主要介紹了Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換的相關(guān)資料,Java8中時(shí)間戳與日期時(shí)間對(duì)象之間的轉(zhuǎn)換是編程中常見的操作,通過時(shí)間字符串獲取時(shí)間對(duì)象也是其中的一種方法,需要的朋友可以參考下
    2025-03-03
  • 運(yùn)行java的class文件方法詳解

    運(yùn)行java的class文件方法詳解

    這篇文章主要詳細(xì)介紹了運(yùn)行java的class文件方法的相關(guān)資料,需要的朋友可以參考下
    2015-02-02
  • Java線程休眠的5種方法

    Java線程休眠的5種方法

    這篇文章主要介紹了Java線程休眠的5種方法,分別是Thread.sleep、TimeUnit、wait、Condition、LockSupport,下面文章將對(duì)這五種方法進(jìn)行詳細(xì)講解,需要的小伙伴可以參考一下
    2022-05-05
  • IntelliJ IDEA 好用插件之a(chǎn)nalyze inspect code詳解

    IntelliJ IDEA 好用插件之a(chǎn)nalyze inspect code詳解

    這篇文章主要介紹了IntelliJ IDEA 好用插件之a(chǎn)nalyze inspect code的相關(guān)知識(shí),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-12-12

最新評(píng)論