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

JAVA常用分布式鎖Redisson詳解

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

1. 加鎖過程

底層命令與數據結構

  • Redis 數據結構:使用 Hash 結構存儲鎖信息,Key 為鎖名稱,Field 為客戶端唯一標識(如 UUID + 線程ID),Value 為鎖的重入次數。
  • 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)或屬于當前線程(hexists 為 1),則增加重入次數并刷新過期時間。
  • 若鎖被其他線程占用,返回鎖的剩余生存時間(TTL)。

可重入性

同一線程多次獲取鎖時,重入次數遞增,確保不會因多次加鎖導致死鎖。

2. 鎖自動續(xù)期(Watchdog 機制)

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

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;
  • 減少重入次數,若次數歸零則刪除鎖,并通過 Pub/Sub 通知等待線程。
  • 確保只有鎖的持有者能釋放鎖,避免誤刪。

4. 鎖競爭與等待

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

5. 高可用與容錯 Redis 部署模式

  • 單節(jié)點模式:簡單但存在單點故障風險。
  • 主從/集群模式:使用 RedissonMultiLock 實現 RedLock 算法(需多個獨立 Redis 節(jié)點):
    • 向所有節(jié)點順序申請鎖。
    • 當多數節(jié)點加鎖成功且總耗時小于鎖超時時間時,認為加鎖成功。
    • 規(guī)避主從切換導致鎖丟失的問題,但需權衡性能和一致性。

6. 關鍵注意事項

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

總結

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

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

相關文章

  • IDEA一鍵完成格式化、去除無用引用、編譯的操作

    IDEA一鍵完成格式化、去除無用引用、編譯的操作

    這篇文章主要介紹了IDEA一鍵完成格式化、去除無用引用、編譯的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • mybatis 在typeAliases別名時報錯的解決

    mybatis 在typeAliases別名時報錯的解決

    這篇文章主要介紹了mybatis 在typeAliases別名時報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • spring boot 添加admin監(jiān)控的方法

    spring boot 添加admin監(jiān)控的方法

    這篇文章主要介紹了spring boot 添加admin監(jiān)控的相關知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java性能調優(yōu)及排查方式

    Java性能調優(yōu)及排查方式

    這篇文章主要介紹了Java性能調優(yōu)及排查方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 深入解析java虛擬機

    深入解析java虛擬機

    以下是對java中的虛擬機進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • Java命令行參數解析工具jcommander詳解

    Java命令行參數解析工具jcommander詳解

    這篇文章主要為大家介紹了Java命令行參數解析工具jcommander命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • IDEA下Servlet可能出現404的一些情況

    IDEA下Servlet可能出現404的一些情況

    相信有很多小伙伴遇到報錯都不知道怎么處理,今天特地整理了這篇文章,文中對IDEA下Servlet可能出現404的一些情況作了詳細的介紹,需要的朋友可以參考下
    2021-06-06
  • java中VO和DTO之間的轉換實現

    java中VO和DTO之間的轉換實現

    本文主要介紹了java中VO和DTO之間的轉換實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Java枚舉類型enum的詳解及使用

    Java枚舉類型enum的詳解及使用

    這篇文章主要介紹了Java枚舉類型enum的詳解及使用的相關資料,需要的朋友可以參考下
    2017-05-05
  • java javax.annotation.Resource注解的詳解

    java javax.annotation.Resource注解的詳解

    這篇文章主要介紹了javax.annotation.Resource注解的詳解的相關資料,需要的朋友可以參考下
    2016-10-10

最新評論

新田县| 蒲城县| 阿克陶县| 和硕县| 绵竹市| 淮阳县| 三明市| 瑞丽市| 扶沟县| 油尖旺区| 哈尔滨市| 遵义市| 连云港市| 高雄县| 河西区| 长沙县| 杭锦旗| 景洪市| 绥滨县| 平山县| 巍山| 太白县| 泰来县| 苏尼特右旗| 金湖县| 中宁县| 栖霞市| 东台市| 广安市| 台安县| 道孚县| 惠东县| 乃东县| 七台河市| 柘城县| 得荣县| 奉贤区| 澜沧| 托里县| 郓城县| 赤峰市|