JAVA常用分布式鎖Redisson詳解
更新時間:2025年05月16日 10:41:52 作者:時光呢
Redisson分布式鎖通過Lua腳本的原子性、可重入設計、Watchdog 自動續(xù)期和Pub/Sub 通知機制,實現(xiàn)了高效的分布式鎖管理,本文給大家介紹JAVA常用分布式鎖Redisson詳解,感興趣的朋友一起看看吧
1. 加鎖過程
底層命令與數(shù)據(jù)結構
- Redis 數(shù)據(jù)結構:使用 Hash 結構存儲鎖信息,Key 為鎖名稱,F(xiàn)ield 為客戶端唯一標識(如
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)或屬于當前線程(hexists
為 1),則增加重入次數(shù)并刷新過期時間。 - 若鎖被其他線程占用,返回鎖的剩余生存時間(TTL)。
可重入性
同一線程多次獲取鎖時,重入次數(shù)遞增,確保不會因多次加鎖導致死鎖。
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;
- 減少重入次數(shù),若次數(shù)歸零則刪除鎖,并通過 Pub/Sub 通知等待線程。
- 確保只有鎖的持有者能釋放鎖,避免誤刪。
4. 鎖競爭與等待
- 自旋重試:若鎖被占用,客戶端進入循環(huán),間隔性嘗試加鎖。
- Pub/Sub 訂閱通知:通過訂閱鎖釋放事件(
redisChannel
),避免頻繁輪詢。當鎖釋放時,Redis 發(fā)布消息通知等待線程競爭鎖,減少無效請求。
5. 高可用與容錯 Redis 部署模式
- 單節(jié)點模式:簡單但存在單點故障風險。
- 主從/集群模式:使用
RedissonMultiLock
實現(xiàn) RedLock 算法(需多個獨立 Redis 節(jié)點):- 向所有節(jié)點順序申請鎖。
- 當多數(shù)節(jié)點加鎖成功且總耗時小于鎖超時時間時,認為加鎖成功。
- 規(guī)避主從切換導致鎖丟失的問題,但需權衡性能和一致性。
6. 關鍵注意事項
- 業(yè)務執(zhí)行時間:業(yè)務邏輯必須在鎖的過期時間內(nèi)完成,否則鎖可能提前釋放。
- 時鐘同步問題:在 RedLock 中,若 Redis 節(jié)點間時鐘不同步,可能導致鎖失效。
- 網(wǎng)絡延遲:極端情況下,鎖可能被多個客戶端同時持有(需結合業(yè)務冪等性處理)。
總結
- Redisson 分布式鎖通過 Lua 腳本的原子性、可重入設計、Watchdog 自動續(xù)期和 Pub/Sub 通知機制,實現(xiàn)了高效的分布式鎖管理。其核心優(yōu)勢在于:
- 避免誤刪鎖(僅持有者可釋放)。
- 支持可重入,適應復雜業(yè)務邏輯。
- 自動續(xù)期防止業(yè)務未完成時鎖過期。
- 通過 RedLock 支持高可用場景,但需謹慎權衡一致性與性能。
到此這篇關于JAVA常用分布式鎖Redisson的文章就介紹到這了,更多相關java分布式鎖redisson內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用IDEA向Gitee提交SpringBoot項目進行遠程管理
本文主要介紹了使用IDEA向Gitee提交SpringBoot項目進行遠程管理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01盤點SpringBoot中@Async注解的遇到的坑點及解決辦法
SpringBoot是一個流行的Java開發(fā)框架,在異步編程方面,Spring Boot提供了@Async注解,它能夠讓方法異步執(zhí)行,然而,在使用@Async注解時,有一些潛在的坑需要注意,本文將深入探討Spring Boot中使用@Async注解時可能遇到的8大坑點,并提供相應的解決方案2024-03-03IntelliJ IDEA 好用插件之a(chǎn)nalyze inspect code詳解
這篇文章主要介紹了IntelliJ IDEA 好用插件之a(chǎn)nalyze inspect code的相關知識,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-12-12