redisson tryLock

應用場景
RLock rLock = redissonClient.getLock(Constant_LOCK + request.getId());
try {boolean isLocked = rLock.tryLock();if (!isLocked) {throw new ServiceException(ErrConstant.OPERATION_FAILED, "請勿重復提交");}
源碼
public interface RLock extends Lock, RLockAsync {String getName();void lockInterruptibly(long var1, TimeUnit var3) throws InterruptedException;boolean tryLock(long var1, long var3, TimeUnit var5) throws InterruptedException;void lock(long var1, TimeUnit var3);boolean forceUnlock();boolean isLocked();boolean isHeldByThread(long var1);boolean isHeldByCurrentThread();int getHoldCount();long remainTimeToLive();
}

實際上?

tryLock 是lock接口方法,redisson重寫了

Redisson?tryLock(long time, TimeUnit unit)?方法深度解析

Redisson 的?tryLock(long time, TimeUnit unit)?方法是分布式鎖的核心 API 之一,下面我將從多個維度詳細解析其工作原理和使用場景。

方法簽名

java

boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;

核心特性解析

1. 參數含義

  • waitTime:獲取鎖的最大等待時間

  • leaseTime:鎖的持有時間(自動釋放時間)

  • unit:時間單位

2. 返回值

  • true:成功獲取鎖

  • false:在等待時間內未獲取到鎖

底層實現機制

1. Redis 數據結構

使用 Hash 結構存儲鎖信息:

text

key: "lock_name"
field: "客戶端ID:線程ID"
value: 重入次數

2. Lua 腳本原子操作

Redisson 通過 Lua 腳本保證原子性:

lua

-- 嘗試獲取鎖的Lua腳本
if (redis.call('exists', KEYS[1]) == 0) thenredis.call('hincrby', KEYS[1], ARGV[2], 1)redis.call('pexpire', KEYS[1], ARGV[1])return nil
end
-- 已存在鎖時的處理...

3. 看門狗機制(leaseTime = -1 時)

  • 默認情況下啟動看門狗

  • 每 10 秒(默認)檢查并續期鎖

  • 保持鎖直到顯式釋放

典型使用場景

1. 基本用法

java

RLock lock = redisson.getLock("myLock");
boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);
try {if (isLocked) {// 業務邏輯}
} finally {if (isLocked) {lock.unlock();}
}

2. 不同參數組合效果

waitTimeleaseTime行為特點
0>0立即嘗試,獲取失敗直接返回
>0>0在指定時間內循環嘗試
>0-1獲取成功后啟動看門狗自動續期
0-1立即嘗試+自動續期

異常處理要點

  1. InterruptedException

    • 等待期間線程被中斷會拋出

    • 需要正確處理中斷狀態

  2. 鎖續期失敗

    • 看門狗續期失敗會自動釋放鎖

    • 業務代碼應實現冪等性

性能優化建議

  1. 合理設置等待時間

    • 避免設置過長的 waitTime

    • 根據業務平均處理時間設置 leaseTime

  2. 避免鎖競爭

    java

    // 使用隨機退避
    while (!lock.tryLock(50, 100, TimeUnit.MILLISECONDS)) {Thread.sleep(random.nextInt(100));
    }
  3. 監控建議

    • 監控鎖等待時間

    • 設置鎖等待超時告警

與其他方法的對比

方法特點適用場景
lock()阻塞直到獲取鎖必須獲取鎖的場景
tryLock()嘗試獲取,可設置超時有限等待的場景
tryLock(0, ...)立即嘗試一次非阻塞快速失敗場景

實現原理示意圖

text

[客戶端A] --(tryLock)--> [Redis服務器]|___ 1. 檢查鎖是否存在|___ 2. 不存在則獲取鎖|___ 3. 存在則等待重試|___ 4. 獲取成功啟動看門狗(leaseTime=-1)

使用注意事項

  1. 必須釋放鎖

    java

    try {if (lock.tryLock(...)) {// ...}
    } finally {lock.unlock();
    }
  2. 避免死鎖

    • 確保 leaseTime > 業務執行時間

    • 或使用默認的看門狗機制

  3. 集群模式特殊處理

    • RedLock 算法需要多數節點確認

    • 網絡分區時可能有腦裂問題

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

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

相關文章

前端docx庫實現將html頁面導出word

前言:最近遇到一個需求,需要將頁面的html導出為word文檔,并且包含橫向和豎向頁面,并且可以進行混合方向導出。經過一段時間的實驗,發現只有docx這個庫滿足這個要求。在這里記錄一下實現思路以及代碼。 docx官網 一、…

虛擬主機CPU占用100導致打不開的一次處理

背景 突然有一天,有個客戶網站打不開了,發來這樣一張圖片問題排查 打開阿里云虛擬主機控制面板,CPU 使用率已經達到了100%,這說明網站已經在高負荷運轉。分析訪問日志發現,網站出現了大量循環路徑,其 UserA…

設計模式之工廠模式:對象創建的智慧之道

工廠模式:對象創建的智慧之道 引言:為什么我們需要工廠模式? 在軟件開發中,對象創建是最常見的操作之一。當代碼中充滿new關鍵字時,系統會面臨三大痛點: 緊耦合:客戶端代碼直接依賴具體實現類擴…

Docker鏡像制作案例

1、使用Docker commit制作鏡像為ubuntu鏡像提供ssh服務①:拉取鏡像[rootopenEuler-1 ~]# docker pull ubuntu:18.04②:啟動鏡像[rootopenEuler-1 ~]# docker run --name c1 -it --rm ubuntu:18.04 bash③:替換aliyun源mv /etc/apt/sources.li…

KeilMDK5如何生成.bin文件

1:主要是要找到fromelf.exe的路徑2:接下來要做的要視情況而定:選完fromelf.exe后在輸入框中加個空格然后加一串字 : --bin -o ./Obj/L.bin ./Obj/L.axf,如下我設置的L最終會替換成項目名 3:去構建生成編譯一下&#…

Ajax接收java后端傳遞的json對象包含長整型被截斷導致丟失精度的解決方案

問題描述 在使用java編寫代碼的時候,后端返回前端的JSON對象中包含了Long長整型,前端接受的時候丟失了精度問題。 比如: 后端傳遞的json {"code": "200","msg": "操作成功","data":

MybatisPlus由淺入深

MyBatis-Plus&#xff08;簡稱 MP&#xff09;是一個 MyBatis 的增強工具&#xff0c;旨在簡化開發過程。基本使用步驟1.依賴引入<!-- mysql依賴 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>…

藍牙信號強度(RSSI)與鏈路質量(LQI)的測量與應用:面試高頻考點與真題解析

在藍牙通信領域&#xff0c;信號強度&#xff08;RSSI&#xff09;和鏈路質量&#xff08;LQI&#xff09;是評估無線鏈路性能的核心指標。無論是智能家居設備的連接優化&#xff0c;還是工業物聯網中的抗干擾設計&#xff0c;這兩個指標都扮演著關鍵角色。本文將結合面試高頻考…

PyTorch的計算圖是什么?為什么繪圖前要detach?

在PyTorch中&#xff0c;計算圖&#xff08;Computational Graph&#xff09; 是自動求導&#xff08;Autograd&#xff09;的核心機制。理解計算圖有助于解釋為什么在繪圖前需要使用 .detach() 方法分離張量。一、什么是計算圖&#xff1f; 計算圖是一種有向無環圖&#xff08…

深度學習入門代碼詳細注釋-ResNet18分類螞蟻蜜蜂

本項目將基于PyTorch平臺遷移ResNet18模型。該模型原采用ImageNet數據集&#xff08;含1000個圖像類別&#xff09;進行訓練。我們將嘗試運用該模型對螞蟻和蜜蜂進行分類&#xff08;這兩個類別未包含在原訓練數據集中&#xff09;。 本文的原始代碼參考于博客深度學習入門項目…

北京飲馬河科技公司 Java 實習面經

北京飲馬河科技公司 Java 實習面經 本文作者&#xff1a;程序員小白條 本站地址&#xff1a;https://xbt.xiaobaitiao.top 1&#xff09; 面試官&#xff1a;我看你這塊是有一個開源的項目&#xff0c;這個項目主要是做什么的&#xff1f; 我&#xff1a;主要兩點是亮點&…

java基礎(day07)

目錄 OOP編程 方法 方法的調用&#xff1a; 在main入口函數中調用&#xff1a; 動態參數&#xff1a; 方法重載 OOP編程 方法 概念&#xff1a;指為獲得某種東西或達到某種目的而采取的手段與行為方式。有時候被稱作“方法”&#xff0c;有時候被稱作“函數”。例如UUID.…

使用EasyExcel動態合并單元格(模板方法)

1、導入EasyExcel依賴<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version> </dependency>2、編寫實體類Data publci class Student{ ExcelProperty("姓名")pri…

jenkins 流水線比較簡單直觀的

//全篇沒用自定義變量pipeline {agent any// 使用工具自動配置Node.js環境tools {nodejs nodejs22 // 需在Jenkins全局工具中預配置該名稱的Node.js安裝}//下面拉取代碼通過的是流水線片段生成的stages {stage(Checkout Code) {steps {git branch: release-v1.2.6,credentials…

CV目標檢測中的LetterBox操作

LetterBox類比理解&#xff1a;想象你要把一張任意形狀的照片放進一個正方形的相框里&#xff0c;照片不能變形拉伸&#xff0c;所以你先等比例縮小照片&#xff0c;然后在空余的地方填上灰色背景。第1章 數學原理當我們有一個原始圖像的尺寸為 19201080&#xff08;寬高&#…

Leetcode 3614. Process String with Special Operations II

Leetcode 3614. Process String with Special Operations II 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3614. Process String with Special Operations II 1. 解題思路 這一題思路上是一個逆推的思路。 首先&#xff0c;我們順序走一輪不難得到最終我們能夠獲得的字符串…

.NET ExpandoObject 技術原理解析

&#x1f31f; .NET ExpandoObject 技術原理解析 引用&#xff1a; .NET 剖析4.0上ExpandoObject動態擴展對象原理風瀟瀟人渺渺快意刀山中草 #mermaid-svg-RtpHctpdchPPN1Xo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…

放蘋果(信息學奧賽一本通-T1192)

【題目描述】把M個同樣的蘋果放在N個同樣的盤子里&#xff0c;允許有的盤子空著不放&#xff0c;問共有多少種不同的分法&#xff1f;&#xff08;用K表示&#xff09;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一種分法。【輸入】第一行是測試數據的數目…

(懶人救星版)CNN_Kriging_NSGA2_Topsis(多模型融合典范)深度學習+SCI熱點模型+多目標+熵權法 全網首例,完全原創,早用早發SCI

全網首例&#xff0c;完全原創&#xff0c;早用早發SCI&#xff08;多模型融合典范&#xff09;機器學習SCI熱點模型多目標熵權法(懶人救星版)BP_Kriging_NSGA2_Topsis 改進克里金工作量大&#xff1a;多模型融合創新性&#xff1a;首次結合BP神經網絡和克里金多目標利用 BP神…

LeetCode熱題100【第一天】

第一題 兩數之和 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案&#xff0c;并且你不能使用兩次相同的元素。 你可以按任意順序返回…