Redisson 分布式鎖原理

加鎖原理

image-20250307162041799

# 如果鎖不存在 
if (redis.call('exists', KEYS[1]) == 0) then# hash結構,鎖名稱為key,線程唯一標識為itemKey,itemValue為一個計數器。支持相同客戶端線程可重入,每次加鎖計數器+1.redis.call('hincrby', KEYS[1], ARGV[2], 1);# 設置過期時間redis.call('pexpire', KEYS[1], ARGV[1]);# 成功獲取鎖返回nullreturn nil;
end ;
#如果是當前線程占有分布式鎖,允許重入鎖
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then# 將鎖重入計數器自增1.redis.call('hincrby', KEYS[1], ARGV[2], 1);# 設置過期時間redis.call('pexpire', KEYS[1], ARGV[1]);# 成功獲取鎖返回nullreturn nil;
end ;
#如果獲取不到鎖,返回鎖剩余過期時間,方便后續代碼設置等待超時時間
return redis.call('pttl', KEYS[1]);

在分布式鎖中,采用hash結構用來存儲鎖,其中大key表示表示這把鎖是否存在,用小key表示當前這把鎖被哪個線程持有。HINCRBY 可以在 KEYS[1](哈希鍵)不存在時直接創建并執行遞增操作。

KEYS[1] : 鎖名稱

ARGV[1]: 鎖失效時間

ARGV[2]: uuid + “:” + threadId; 鎖的小key,客戶端唯一標識

image-20250307163702718

image.png

圖1處:判斷獲取鎖是否等待(waitTime)超時,如果等待超時則直接返回獲取鎖失敗。

圖2處:如果等待未超時,則嘗試訂閱解鎖channel。

圖3處:獲取ReissonLockEntry(獲取成功表示訂閱成功),超時時長設置為當前剩余的等待時間(waitTime)。 如果獲取ReissonLockEntry超時,終止并取消訂閱解鎖消息channel,獲取鎖失敗。

直到獲取鎖成功或者超時失敗。 解鎖消息廣播給所有鎖競爭的客戶端,收到解鎖消息后,客戶端會有一個線程去重新競爭鎖。當有解鎖消息到達時,不需要恢復所有掛起的線程一起去競爭分布式鎖,只需要喚醒一個線程去和集群中其它節點搶奪就可以了。這樣好處是顯而易見的,避免了大量的無效Redis請求,因為鎖在集群中同一時刻只會有一個線程能持有。

解鎖原理

# 判斷鎖是否為自己持有,不為自己持有則不允許解鎖。
if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) thenreturn nil;
end ;
# 由于支持可重入,所以這里需要判斷是否完全解鎖,每解一次鎖重入計數器減1.
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;

watch dog原理

Redisson 的看門狗機制(WatchDog)是一種自動續期機制,旨在確保任務執行期間鎖不會因超時而被誤釋放

  • 原理:當客戶端獲取到鎖后,Redisson 會啟動一個后臺定時任務(即看門狗)。在鎖的持有期間,看門狗會以默認間隔(10秒)不斷地續期,延長鎖的過期時間,使鎖的默認過期時間始終保持為30秒。這樣,只要任務未完成且客戶端仍然活躍,鎖就不會過期。
  • 默認行為:默認情況下,Redisson 會開啟看門狗機制,無需開發者手動配置。如果不想啟用看門狗機制,可以在調用 tryLock 時指定 leaseTime 參數。
  • leaseTime設置的影響:如果顯式設置 leaseTime(例如通過 tryLock(waitTime, leaseTime, TimeUnit.SECONDS)),看門狗機制將不會啟動。鎖會在 leaseTime 到期時自動釋放。當鎖超時時間為 -1 時,而且獲取鎖成功時,會啟動看門狗定時任務自動續鎖。

Redisson 中,tryLock(waitTime, leaseTime, TimeUnit.SECONDS) 方法是一個嘗試獲取分布式鎖的非阻塞方法,通過等待和設置鎖的租約時間來控制鎖的行為。

參數解釋

  • waitTime:最大等待時間,即在嘗試獲取鎖時,線程等待的最大時間。如果在這段時間內鎖沒有被其他線程釋放,當前線程會放棄獲取鎖,返回 false
  • leaseTime:鎖的租約時間,即鎖的自動釋放時間。如果成功獲取鎖后,線程在 leaseTime 時間內沒有手動釋放鎖,鎖將自動失效并釋放給其他線程。這個參數用于確保鎖不會一直持有,避免死鎖。
  • TimeUnit:時間單位,可以設置為秒、毫秒等

img

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74141.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構】棧與隊列:基礎 + 競賽高頻算法實操(含代碼實現)

什么是棧?什么是隊列? 什么是先進后出?什么是先進先出? 了解基礎之后,又如何用來寫算法題? 帶著這些疑問,讓我帶領你,走進棧與隊列的世界 棧與隊列 棧: 1、棧的基本…

單元化架構在字節跳動的落地實踐

資料來源:火山引擎-開發者社區 什么是單元化 單元化的核心理念是將業務按照某種維度劃分成一個個單元, 理想情況下每個單元內部都是完成所有業務操作的自包含集合,能獨立處理業務流程,各個單元均有其中一部分數據,所有…

基于Python的垃圾短信分類

垃圾短信分類 1 垃圾短信分類問題介紹 1.1 垃圾短信 隨著移動互聯科技的高速發展,信息技術在不斷改變著我們的生活,讓我們的生活更方便,其中移動通信技術己經在我們生活起到至關重要的作用,與我們每個人人息息相關。短信作為移…

leetcode1971.尋找圖中是否存在路徑

初嘗并查集&#xff0c;直接套用模板 class Solution { private:vector<int> father;void init() {for(int i0;i<father.size();i)father[i]i;}int find(int v) {return vfather[v]?v:father[v]find(father[v]);//路徑壓縮}bool isSame(int u,int v){ufind(u);vfind…

QAI AppBuilder 快速上手(7):目標檢測應用實例

YOLOv8_det是YOLO 系列目標檢測模型&#xff0c;專為高效、準確地檢測圖像中的物體而設計。該模型通過引入新的功能和改進點&#xff0c;如因式分解卷積&#xff08;factorized convolutions&#xff09;和批量歸一化&#xff08;batch normalization&#xff09;&#xff0c;在…

景聯文科技:以高質量數據標注推動人工智能領域創新與發展

在當今這個由數據驅動的時代&#xff0c;高質量的數據標注對于推動機器學習、自然語言處理&#xff08;NLP&#xff09;、計算機視覺等領域的發展具有不可替代的重要性。數據標注過程涉及對原始數據進行加工&#xff0c;通過標注特定對象的特征來生成能夠被機器學習模型識別和使…

MySQL 索引下推

概念 索引下推&#xff08;Index Condition Pushdown&#xff0c;簡稱 ICP&#xff09; 是 MySQL 5.6 版本中提供的一項索引優化功能&#xff0c;它允許存儲引擎在索引遍歷過程中&#xff0c;執行部分 WHERE字句的判斷條件&#xff0c;直接過濾掉不滿足條件的記錄&#xff0c;…

NVIDIA Dynamo源碼編譯

Ref https://github.com/PyO3/maturin Rust 程序設計語言 代碼庫&#xff1a; https://github.com/ai-dynamo/dynamo https://github.com/ai-dynamo/nixl dynamo/container/Dockerfile.vllm 相關whl包 官方提供了4個whl包 ai_dynamo # 這個包ubuntu 22.04也可以用&…

【Android】安卓原生應用播放背景音樂與音效(筆記)

本文提供完整的音頻管理器代碼&#xff0c;涵蓋了背景音樂&#xff08;BGM&#xff09;和短音效的播放控制。無論是游戲中的音效&#xff0c;還是應用中的背景音樂&#xff0c;通過 AudioManager&#xff0c;你可以方便地管理和控制音頻資源。 前言 在 Android 開發中&#xf…

Unity | 游戲數據配置

目錄 一、ScriptableObject 1.創建ScriptableObject 2.創建asset資源 3.asset資源的讀取與保存 二、Excel轉JSON 1.Excel格式 2.導表工具 (1)處理A格式Excel (2)處理B格式Excel 三、解析Json文件 1.讀取test.json文件 四、相關插件 在游戲開發中,策劃…

2025信創即時通訊排行:安全合規與生態適配雙輪驅動

隨著信息技術應用創新&#xff08;信創&#xff09;戰略的深化&#xff0c;國產即時通訊工具在政企市場的滲透率顯著提升。2025年作為“十四五”規劃收官之年&#xff0c;信創產業迎來規模化應用關鍵節點。本文將從認證標準、市場表現、技術架構、行業適配四大維度&#xff0c;…

關于TVS管漏電流的問題?

問題描述&#xff1a; 在量產的帶電池故事機生產中&#xff0c;工廠產線測試電流時&#xff0c;有1臺機器電流比正常機器大10mA左右。 原因分析&#xff1a; 1、分析電路原理圖&#xff0c;去除可能出現問題的電壓或器件&#xff08;不影響系統&#xff09;&#xff0c;發現…

RAG 架構地基工程-Retrieval 模塊的系統設計分享

目錄 一、知識注入的關鍵前奏——RAG 系統中的檢索綜述 &#xff08;一&#xff09;模塊定位&#xff1a;連接語言模型與知識世界的橋梁 &#xff08;二&#xff09;核心任務&#xff1a;四大關鍵問題的協調解法 &#xff08;三&#xff09;系統特征&#xff1a;性能、精度…

Java-servlet(七)詳細講解Servlet注解

Java-servlet&#xff08;七&#xff09;詳細講解Servlet注解 前言一、注解的基本概念二、Override 注解2.1 作用與優勢2.2 示例代碼 三、Target 注解3.1 定義與用途3.2 示例代碼 四、WebServlet 注解4.1 作用4.2 示例代碼 五、反射與注解5.1 反射的概念5.2 注解與反射的結合使…

機器學習——分類、回歸、聚類、LASSO回歸、Ridge回歸(自用)

糾正自己的誤區&#xff1a;機器學習是一個大范圍&#xff0c;并不是一個小的方向&#xff0c;比如&#xff1a;線性回歸預測、卷積神經網絡和強化學都是機器學習算法在不同場景的應用。 機器學習最為關鍵的是要有數據&#xff0c;也就是數據集 名詞解釋&#xff1a;數據集中的…

本地AI大模型工具箱 Your local AI toolkit:LMStudio

LMStudio介紹 官網&#xff1a;LM Studio - Discover, download, and run local LLMs LMStudio 是一個面向機器學習和自然語言處理的&#xff0c;旨在使開發者更容易構建和部署AI語言模型的應用軟件。 LMStudio的特點是&#xff1a; 完全本地離線運行AI大模型 可以從Huggi…

[OpenCV】相機標定之棋盤格角點檢測與繪制

在OpenCV中&#xff0c;棋盤格角點檢測與繪制是一個常見的任務&#xff0c;通常用于相機標定。 棋盤格自定義可參考: OpenCV: Create calibration pattern 目錄 1. 棋盤格角點檢測 findChessboardCorners()2. 棋盤格角點繪制 drawChessboardCorners()3. 代碼示例C版本python版本…

redis的典型應用 --緩存

Redis最主要的用途&#xff0c;分為三個方面&#xff1a; 1.存儲數據&#xff08;內存數據庫&#xff09; 2.緩存&#xff08;最常用&#xff09; 3.消息隊列 緩存 (cache) 是計算機中的?個經典的概念。核?思路就是把?些常?的數據放到觸?可及(訪問速度更快)的地?&…

本地基于Ollama部署的DeepSeek詳細接口文檔說明

前文&#xff0c;我們已經在本地基于Ollama部署好了DeepSeek大模型&#xff0c;并且已經告知過如何查看本地的API。為了避免網絡安全問題&#xff0c;我們希望已經在本地調優的模型&#xff0c;能夠嵌入到在本地的其他應用程序中&#xff0c;發揮本地DeepSeek的作用。因此需要知…

基于ArcGIS和ETOPO-2022 DEM數據分層繪制全球海陸分布

第〇部分 前言 一幅帶有地理空間參考、且包含海陸分布的DEM圖像在研究區的繪制中非常常見&#xff0c;本文將實現以下圖像的繪制 關鍵步驟&#xff1a; &#xff08;1&#xff09;NOAA-NCEI官方下載最新的ETOPO-2022 DEM數據 &#xff08;2&#xff09;在ArcGIS&#xff08;…