Redis實現分布式鎖的進階版:Redisson實戰指南

一、為什么選擇Redisson?

在上一篇文章中,我們通過Redis原生命令實現了分布式鎖。但在實際生產環境中,這樣的基礎方案存在三大痛點:

  1. 鎖續期難題:業務操作超時導致鎖提前釋放
  2. 不可重入限制:同一線程無法重復獲取已持有的鎖
  3. 高可用風險:單點故障可能導致鎖失效

Redisson作為Redis官方推薦的Java客戶端,提供了開箱即用的分布式鎖實現,其核心優勢在于:

  • 自動續期機制(看門狗)
  • 可重入鎖支持
  • 多種鎖類型(公平鎖、聯鎖等)
  • 完善的異常處理

二、快速集成Redisson

2.1 引入依賴

在Maven項目中添加依賴:

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.23.2</version>
</dependency>

2.2 配置連接(Spring Boot示例)

@Configuration
@ConfigurationProperties(prefix = "spring.redis")
public class RedissonConfig {private String host;private String password;private int port;@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password).setTimeout(3000);return Redisson.create(config);}
}

配置說明

  • address格式:redis://IP:PORT 或 rediss://IP:PORT(SSL加密)
  • timeout:操作超時時間(毫秒)

三、Redisson分布式鎖核心API

3.1 基礎鎖操作

// 獲取鎖對象
RLock lock = redissonClient.getLock("orderLock");// 阻塞式獲取鎖(默認30秒有效期,自動續期)
lock.lock();// 嘗試獲取鎖(等待10秒,鎖持有15秒)
boolean res = lock.tryLock(10, 15, TimeUnit.SECONDS);// 釋放鎖
lock.unlock();

3.2 看門狗機制原理

當使用無參lock()方法時:

  1. 默認設置鎖過期時間30秒
  2. 啟動后臺線程每10秒檢查一次
  3. 如果線程仍持有鎖,自動續期到30秒

3.3 三種加鎖方式對比

方法簽名特點適用場景
void lock()阻塞等待,自動續期長期持有鎖場景
boolean tryLock()立即返回結果快速失敗場景
boolean tryLock(long waitTime, …)可設置等待時間,手動控制有效期精確控制鎖持有時間的業務

四、實戰:司機搶單系統

4.1 業務場景分析

假設網約車系統中:

  • 多個司機同時搶同一個訂單
  • 訂單狀態變更需要原子操作
  • 高并發下需保證數據一致性

4.2 分布式鎖實現方案

public Boolean robOrder(Long driverId, Long orderId) {final String lockKey = RedisConstant.ROB_ORDER_LOCK + orderId;RLock lock = redissonClient.getLock(lockKey);try {// 嘗試獲取鎖(最多等待2秒,鎖持有5秒)if (lock.tryLock(2, 5, TimeUnit.SECONDS)) {// 二次校驗訂單狀態if (!redisTemplate.hasKey(ORDER_AVAILABLE_KEY)) {throw new BusinessException("訂單已被搶");}// 執行核心業務邏輯updateOrderStatus(driverId, orderId);// 移除可用標記redisTemplate.delete(ORDER_AVAILABLE_KEY);return true;}return false;} catch (InterruptedException e) {Thread.currentThread().interrupt();throw new BusinessException("系統中斷異常");} finally {// 僅釋放當前線程持有的鎖if (lock.isHeldByCurrentThread()) {lock.unlock();}}
}

4.3 關鍵代碼解析

  1. 鎖命名策略

    • 使用訂單ID作為鎖后綴,實現細粒度控制
    • 示例:rob_order_lock:20230815001
  2. 雙重檢查機制

    • 獲取鎖前快速失敗
    • 獲取鎖后再次校驗業務狀態
  3. 異常處理規范

    • 正確處理InterruptedException
    • finally塊確保鎖釋放

五、生產環境最佳實踐

5.1 鎖使用原則

原則說明反例
最小作用域原則鎖的粒度盡可能小對整個系統使用全局鎖
快速釋放原則業務完成后立即釋放鎖持有鎖進行網絡調用等耗時操作
異常處理原則finally塊確保鎖釋放未處理異常導致死鎖
避免嵌套原則謹慎使用嵌套鎖多層級鎖增加死鎖風險

5.2 常見問題解決方案

問題一:鎖續期時間設置不合理

  • 癥狀:頻繁出現鎖過期
  • 方案:根據業務耗時動態調整
// 根據歷史統計設置合理值
long leaseTime = calculateBusinessTime() + 5; // 增加5秒緩沖
lock.tryLock(2, leaseTime, TimeUnit.SECONDS);

問題二:客戶端時鐘不同步

  • 癥狀:鎖提前/延后釋放
  • 方案:啟用NTP時間同步服務

問題三:Redis集群故障轉移

  • 癥狀:腦裂導致多客戶端持有鎖
  • 方案:使用RedLock算法
RLock lock1 = redissonClient1.getLock("lock");
RLock lock2 = redissonClient2.getLock("lock");
RLock lock3 = redissonClient3.getLock("lock");RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
redLock.lock();

六、性能優化建議

  1. 連接池配置
// 在Redisson配置中優化連接參數
config.useSingleServer().setConnectionPoolSize(64)  // 連接池大小.setConnectionMinimumIdleSize(24); // 最小空閑連接
  1. 監控指標收集
  • 鎖等待時間
  • 鎖持有時間
  • 鎖競爭頻率
  1. 壓力測試方案
// 使用JMeter模擬并發場景
ThreadGroup:Number of Threads: 100Ramp-Up Period: 5s
Loop Controller:Loop Count: Forever

七、擴展應用場景

7.1 分布式限流

RRateLimiter rateLimiter = redisson.getRateLimiter("apiLimit");
// 每秒處理10個請求
rateLimiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS);

7.2 分布式信號量

RSemaphore semaphore = redisson.getSemaphore("parkingSlot");
// 獲取停車位(最多等待10秒)
if(semaphore.tryAcquire(10, TimeUnit.SECONDS)) {try {// 停車操作} finally {semaphore.release();}
}

八、總結與展望

通過Redisson實現分布式鎖,開發者可以:

  • 避免手動處理復雜邊界條件
  • 獲得生產級的可靠性保證
  • 輕松擴展更多分布式功能

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

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

相關文章

大語言模型 12 - 從0開始訓練GPT 0.25B參數量 MiniMind2 補充 訓練開銷 訓練步驟 知識蒸餾 LoRA等

寫在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最廣泛應用的大語言模型架構之一&#xff0c;其強大的自然語言理解與生成能力背后&#xff0c;是一個龐大而精細的訓練流程。本文將從宏觀到微觀&#xff0c;系統講解GPT的訓練過程&#xff0c;…

SID 2025上的天馬,用“好屏”技術重構產業敘事

作為全球最具影響力的顯示行業盛會&#xff0c;SID國際顯示周不僅是技術比拼的舞臺&#xff0c;更是未來產業方向的風向標。SID 2025上的技術密度與產業動態&#xff0c;再一次驗證了這一定律。 Micro-LED、柔性OLED、裸眼3D、量子點、透明顯示等新技術在SID 2025集中亮相&…

【AI News | 20250520】每日AI進展

AI Repos 1、nanoDeepResearch nanoDeepResearch 是一個受 ByteDance 的 DeerFlow 項目啟發&#xff0c;旨在從零開始構建深度研究代理的后端項目。它不依賴 LangGraph 等現有框架&#xff0c;通過實現一個 ReAct 代理和狀態機來模擬 Deep Research 的工作流程。項目主要包含規…

釘釘開發之AI消息和卡片交互開發文檔收集

AI消息和卡片交互開發文檔 智能交互接口能力介紹 AI助理發消息&#xff08;主動直接發送模式 AI 助理發消息 - 主動發送模式 AI 助理發消息 - 回復消息模式 AI 助理發消息 - Webhook 回復消息模式 Stream 模式響應卡片回傳請求事件 upload-media-files AI 助理發消息&a…

Redis中的事務和原子性

在 Redis 中&#xff0c;事務 和 原子性 是兩個關鍵概念&#xff0c;用于保證多個操作的一致性和可靠性。以下是 Redisson 和 Spring Data Redis 在處理原子性操作時的區別與對比&#xff1a; 1. Redis 的原子性機制 Redis 本身通過以下方式保證原子性&#xff1a; 單線程模型…

Apollo10.0學習——planning模塊(8)之scenario、Stage插件詳解二

scenario插件 插件總覽插件ValetParkingScenario階段一&#xff1a;StageApproachingParkingSpotprocess()方法 階段二&#xff1a;StageParkingprocess()方法FinishStage方法 插件PullOverScenarioIsTransferable: 場景切入條件 代碼邏輯階段一&#xff1a;PullOverStageAppro…

JVM的面試相關問題

面試中的相關問題主要是三塊 1.JVM 內存區域劃分 2.JVM 的類加載機制 3.JVM 的垃圾回收機制 JVM Java虛擬機 VM Virtual Machine 虛擬機,用 軟件 來 模擬 硬件 傳統意義上的"虛擬機" 更多指的是 VMWare, Virtual Box, Hyper-V, KVM(構造出虛擬的電腦,甚至可以…

win10使用nginx做簡單負載均衡測試

一、首先安裝Nginx&#xff1a; 官網鏈接&#xff1a;https://nginx.org/en/download.html 下載完成后&#xff0c;在本地文件中解壓。 解壓完成之后&#xff0c;打開conf --> nginx.config 文件 1、在 http 里面加入以下代碼 upstream GY{#Nginx是如何實現負載均衡的&a…

[特殊字符]車牌識別相機,到底用在哪?

停車場管理&#xff0c;快速通行不是夢 停車場大概是車牌識別相機最常見的 “工作崗位” 啦&#xff01;以前進出停車場&#xff0c;取卡、刷卡、人工收費&#xff0c;一系列操作下來&#xff0c;高峰期的時候真的能把人等得不耐煩&#x1f62b; 現在有了車牌識別相機&#xff…

nosqlbooster pojie NoSQLBooster for MongoDB

測過可用&#xff0c;注意 asar的安裝使用報錯改用 npx asar extract app.asar app 路徑 C:\Users{computerName}\AppData\Local\Programs\nosqlbooster4mongo\resources npm install asar -g asar extract app.asar app 打開shared\lmCore.js 修改MAX_TRIAL_DAYS3000 修改…

組態王通過開疆智能profinet轉ModbusTCP網關連接西門子PLC配置案例

本案例是組態王通過使用開疆智能研發的Profinet轉ModbusTCP網關采集西門子1200PLC中數據的案例。 網關配置 首先來配置網關的參數&#xff0c;打開網關配置軟件“Gateway Configuration Studio” 由于組態王那側設定為ModbusTCP客戶端所以網關作為ModbusTCP服務器。新建項目…

大模型服務如何實現高并發與低延遲

寫在前面 大型語言模型(LLM)正以前所未有的速度滲透到各行各業,從智能客服、內容創作到代碼生成、企業知識庫,其應用場景日益豐富。然而,將這些強大的 AI 能力轉化為穩定、高效、可大規模應用的服務,卻面臨著巨大的挑戰,其中高并發處理能力和低響應延遲是衡量服務質量的…

k8s監控方案實踐補充(二):使用kube-state-metrics獲取資源狀態指標

k8s監控方案實踐補充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics獲取資源狀態指標 文章目錄 k8s監控方案實踐補充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics獲取資源狀態指標一、Metrics Server簡介二、kube-state-metrics實戰部署1. 創…

Manus 全面開放注冊,OpenAI 發布 Codex,ChatGPT 上線 GPT-4.1!| AI Weekly 5.12-18

&#x1f4e2;本周 AI 快訊 | 1 分鐘速覽&#x1f680; 1?? &#x1f4dd; Manus 全面開放注冊 &#xff1a;無需邀請碼即可注冊&#xff0c;新用戶免費獲得 1000 積分&#xff0c;每日 300 積分免費任務。 2?? &#x1f50d; 阿里 Qwen 推出「深入研究」 &#xff1a;Qw…

代理(主要是動態)和SpringAOP

代理 靜態代理基于繼承實現動態代理是基于接口實現 業務層每次實現轉賬都需要執行&#xff0c;可以把他們拿出來當成一個切面&#xff0c;自己寫出一個代理類&#xff0c;讓業務層只執行業務的邏輯&#xff0c;重復的代碼代理類來完成&#xff0c;然后調用代理類來執行。 代理類…

uniapp打包H5,輸入網址空白情況

由于客戶預算有限&#xff0c;最近寫了兩個uniapp打包成H5的案例&#xff0c;總結下面注意事項 1. 發行–網站-PCWeb或手機H5按鈕&#xff0c;輸入名稱&#xff0c;網址 點擊【發行】&#xff0c;生成文件 把這個給后端&#xff0c;就可以了 為什么空白呢 最重要一點&#xf…

uniapp-商城-63-后臺 商品列表(分類展示商品的刪除)

商品列表中的數據需要進行狀態管理&#xff0c;如上架、下架、刪除和修改等操作。對于存在錯誤或后期需要重新上傳的商品&#xff0c;可以通過刪除操作進行處理。 具體到商品刪除功能的實現&#xff0c;其基本流程如下&#xff1a;用戶在前端頁面點擊刪除按鈕后&#xff0c;系統…

學習設計模式《十》——代理模式

一、基礎概念 代理模式的本質【控制對象訪問】&#xff1b; 代理模式的定義&#xff1a;為其他對象提供一種代理以控制對這個對象的訪問&#xff1b; 代理模式的功能&#xff1a;代理模式是通過創建一個代理對象&#xff0c;用這個代理對象去代表真實的對象&#xff1b;客戶端得…

阿里云web端直播(前端部分)

阿里云&#xff1a;Web播放器快速接入_視頻點播(VOD)-阿里云幫助中心 import Aliplayer from aliyun-aliplayerimport aliyun-aliplayer/build/skins/default/aliplayer-min.css<div id"J_prismPlayer" style"width: 300px; height: 300px;" />var …

深入解析OrientDB:多模型數據庫的技術優勢與實際應用

OrientDB 是一款開源的多模型 NoSQL 數據庫&#xff0c;融合了文檔數據庫、圖數據庫和對象數據庫的特性。它不僅支持靈活的數據建模&#xff0c;還提供了高性能的查詢能力&#xff0c;適用于社交網絡、物聯網、內容管理等場景。本文詳細探討 OrientDB 的核心特性、應用場景&…