Redisson分布式鎖全攻略:用法、場景與要點

目錄

1. 普通可重入鎖(RLock)

2. 公平鎖(RFairLock)

3. 讀寫鎖(RReadWriteLock)

4. 多重鎖(RedissonMultiLock)


1. 普通可重入鎖(RLock)

import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonLockExample {public static void main(String[] args) {// 配置 Redisson 客戶端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 創建 Redisson 客戶端實例RedissonClient redisson = Redisson.create(config);// 獲取鎖實例RLock lock = redisson.getLock("myLock");try {// 嘗試獲取鎖,最多等待 100 秒,鎖持有時間為 10 秒boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);if (isLocked) {// 執行業務邏輯System.out.println("Lock acquired by " + Thread.currentThread().getName());// 模擬業務邏輯處理Thread.sleep(5000);} else {System.out.println("Failed to acquire lock");}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 釋放鎖if (lock.isHeldByCurrentThread()) {lock.unlock();System.out.println("Lock released by " + Thread.currentThread().getName());}}// 關閉 Redisson 客戶端redisson.shutdown();}
}
應用場景
  • 電商秒殺系統:多個用戶同時請求購買商品,通過分布式鎖確保同一時間只有一個用戶能夠成功下單。

  • 分布式任務調度:多個節點同時運行任務,通過鎖確保任務的唯一性。

注釋說明
  • tryLock 方法:嘗試獲取鎖,可以指定等待時間和鎖的持有時間。

  • isHeldByCurrentThread 方法:檢查當前線程是否持有鎖,避免誤釋放。

  • unlock 方法:釋放鎖,確保在 finally 塊中調用,防止資源泄漏。


2. 公平鎖(RFairLock)

示例代碼
import org.redisson.Redisson;
import org.redisson.api.RFairLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonFairLockExample {public static void main(String[] args) {// 配置 Redisson 客戶端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 創建 Redisson 客戶端實例RedissonClient redisson = Redisson.create(config);// 獲取公平鎖實例RFairLock lock = redisson.getFairLock("myFairLock");try {// 嘗試獲取鎖,最多等待 100 秒,鎖持有時間為 10 秒boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);if (isLocked) {// 執行業務邏輯System.out.println("Fair lock acquired by " + Thread.currentThread().getName());// 模擬業務邏輯處理Thread.sleep(5000);} else {System.out.println("Failed to acquire fair lock");}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 釋放鎖if (lock.isHeldByCurrentThread()) {lock.unlock();System.out.println("Fair lock released by " + Thread.currentThread().getName());}}// 關閉 Redisson 客戶端redisson.shutdown();}
}
應用場景
  • 資源分配系統:多個線程或節點請求資源,通過公平鎖確保按請求順序獲取資源。

  • 隊列處理系統:多個消費者處理隊列中的任務,確保任務按順序處理。

注釋說明
  • 公平鎖特點:按照請求順序獲取鎖,避免饑餓現象。

  • tryLock 方法:與普通鎖類似,但公平鎖會按照請求順序排隊。


3. 讀寫鎖(RReadWriteLock)

示例代碼
import org.redisson.Redisson;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonReadWriteLockExample {public static void main(String[] args) {// 配置 Redisson 客戶端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 創建 Redisson 客戶端實例RedissonClient redisson = Redisson.create(config);// 獲取讀寫鎖實例RReadWriteLock readWriteLock = redisson.getReadWriteLock("myReadWriteLock");// 模擬讀操作Thread readThread = new Thread(() -> {try {readWriteLock.readLock().lock();System.out.println("Read lock acquired by " + Thread.currentThread().getName());// 模擬讀操作Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {readWriteLock.readLock().unlock();System.out.println("Read lock released by " + Thread.currentThread().getName());}});// 模擬寫操作Thread writeThread = new Thread(() -> {try {readWriteLock.writeLock().lock();System.out.println("Write lock acquired by " + Thread.currentThread().getName());// 模擬寫操作Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {readWriteLock.writeLock().unlock();System.out.println("Write lock released by " + Thread.currentThread().getName());}});// 啟動線程readThread.start();writeThread.start();try {readThread.join();writeThread.join();} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 關閉 Redisson 客戶端redisson.shutdown();}
}
應用場景
  • 緩存系統:多個線程讀取緩存,少數線程更新緩存,通過讀寫鎖提高并發性能。

  • 數據庫查詢與更新:多個線程查詢數據庫,少數線程更新數據庫。

注釋說明
  • 讀鎖共享:多個線程可以同時獲取讀鎖。

  • 寫鎖獨占:寫鎖獲取后,其他線程無法獲取讀鎖或寫鎖。

  • 鎖的釋放:確保在 finally 塊中釋放鎖,避免死鎖。


4. 多重鎖(RedissonMultiLock)

示例代碼
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.api.RedissonMultiLock;
import org.redisson.config.Config;public class RedissonMultiLockExample {public static void main(String[] args) {// 配置 Redisson 客戶端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 創建 Redisson 客戶端實例RedissonClient redisson = Redisson.create(config);// 獲取多個鎖實例RLock lock1 = redisson.getLock("myLock1");RLock lock2 = redisson.getLock("myLock2");// 創建多重鎖RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2);try {// 嘗試獲取多重鎖,最多等待 100 秒,鎖持有時間為 10 秒boolean isLocked = multiLock.tryLock(100, 10, TimeUnit.SECONDS);if (isLocked) {// 執行業務邏輯System.out.println("Multi lock acquired by " + Thread.currentThread().getName());// 模擬業務邏輯處理Thread.sleep(5000);} else {System.out.println("Failed to acquire multi lock");}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 釋放多重鎖if (multiLock.isHeldByCurrentThread()) {multiLock.unlock();System.out.println("Multi lock released by " + Thread.currentThread().getName());}}// 關閉 Redisson 客戶端redisson.shutdown();}
}
應用場景
  • 分布式事務:多個資源需要同時鎖定,確保事務的原子性。

  • 復雜業務流程:多個步驟需要分別鎖定不同資源,通過多重鎖確保整體

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

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

相關文章

Node.js 中 Token 原理簡單介紹 + 示例代碼

目錄 ? 什么是 Token? 🔁 原理簡述: 🧩 示例項目:使用 Node.js jsonwebtoken 實現 Token 登錄驗證 📁 文件結構如下: 🔹 server.js(JavaScript) &…

每日OJ_牛客_ruby和薯條_排序+二分/滑動窗口_C++_Java

目錄 ruby和薯條_排序二分/滑動窗口 題目解析 C代碼 Java代碼 ruby和薯條_排序二分/滑動窗口 ruby和薯條 描述: ruby很喜歡吃薯條。 有一天,她拿出了n根薯條。第i根薯條的長度為ai。 ruby認為,若兩根薯條的長度之差在l和r之間&#xf…

從 ComponentActivity 看 Android Activity 的演變與 Jetpack 架構融合

在 Jetpack Compose 出現后,開發者可能會注意到一個變化:項目的主 Activity 默認從過去熟悉的 AppCompatActivity 變成了 ComponentActivity。這個變化并非偶然,而是 Android 架構在向現代組件化演進過程中一個關鍵的轉折點。本文將圍繞 Comp…

Linux 防火墻( iptables )

目錄 一、 Linux 防火墻基礎 1. 防火墻基礎概念 (1)防火墻的概述與作用 (2)防火墻的結構與匹配流程 (3)防火墻的類別與各個防火墻的區別 2. iptables 的表、鏈結構 (1)規則表 …

大數據 - 2. Hadoop - HDFS(分布式文件系統)

前言 為什么海量數據需要分布式存儲技術? 文件過大時,單臺服務器無法承擔,要靠數量來解決。數量的提升帶來的是網絡傳輸、磁盤讀寫、CPU、內存等各方面的提升。 眾多的服務器一起工作,如何保證高效且不出錯 ? 大數…

使用cursor進行原型圖設計

1.下載cursor 2.模式設置: 模型使用claude-3.7-sonnet的think模式 3.引導詞模板: 我想要開發一個中高考英語口語考試的模擬考試系統,我需要將上面的這個應用輸出成高保真的原型圖設計。請考慮以下的規范: 用戶體驗&#xff1…

極狐GitLab 功能標志詳解

極狐GitLab 是 GitLab 在中國的發行版,關于中文參考文檔和資料有: 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 功能標志 (BASIC ALL) 使用功能標志,您可以將應用程序的新功能小批量部署到生產環境中。您可以為部分用戶打開和…

AI與無人駕駛汽車:如何通過機器學習提升自動駕駛系統的安全性?

引言 想象一下,在高速公路上,一輛無人駕駛汽車正平穩行駛。突然,前方的車輛緊急剎車,而旁邊車道有一輛摩托車正快速接近。在這千鈞一發的瞬間,自動駕駛系統迅速分析路況,判斷最安全的避險方案,精…

【NLP 63、大模型應用 —— Agent】

人與人最大的差距就是勇氣和執行力,也是唯一的差距 —— 25.4.16 一、Agent 相關工作 二、Agent 特點 核心特征: 1.專有場景(針對某個垂直領域) 2.保留記憶(以一個特定順序做一些特定任務,記憶當前任務的前…

RAGFlow本地部署教程 :多模態檢索+動態生成,用AI重構企業知識生產力

RAGFlow是一款基于檢索增強生成(RAG)技術的智能工作流平臺,通過整合多源數據檢索與生成式AI模型,優化企業知識管理、智能問答及自動化報告生成,核心功能包括: 多源數據融合:支持數據庫、文檔庫、…

【C/C++】深入理解指針(二)

文章目錄 深入理解指針(二)1.const修飾指針1.1 const修飾變量1.2 const修飾指針變量 2.野指針2.1 野指針成因1.指針未初始化2. 指針越界訪問3.指針指向的空間釋放 2.2 如何規避野指針2.2.1 指針初始化2.2.2 小心指針越界2.2.3 指針變量不再使?時,及時置NULL&#x…

【verilog】在同一個 always 塊中寫了多個“看起來獨立”的 if / if-else,到底誰先誰后,怎么執行?會不會沖突?

🔍 問題本質 在一個 always (posedge clk) 塊中,所有的代碼都是順序執行的。但這不意味著它就像軟件一樣“一條一條執行”,因為最終是電路!電路是并行存在的! Verilog 是硬件描述語言(HDL)&am…

【React】什么是 Hook

useStateuseEffectuseRef 什么是hook?16.8版本出現的新特性。可以在不編寫class組件的情況下使用state以及其它的React特性 為什么有hook?class組件很難提取公共的重用的代碼,然后反復使用;不編寫類組件也可以使用類組件的狀態st…

如何查看自己抖音的IP屬地?詳細教程及如何修改

在當今互聯網時代,IP屬地信息已成為各大社交平臺(如抖音、微博、快手等)展示用戶真實網絡位置的重要功能。以下是關于如何查看抖音IP屬地的詳細教程及常見問題解答,幫助您快速了解相關信息: 一、如何查看抖音賬號的IP屬…

深度學習算力革新:AI服務器在運維工作中的智能化實踐

【導語】作為IT基礎設施服務領域的從業者,我們在日常工作中發現,AI服務器的智能化運維能力正在重塑傳統IDC的管理模式。本文將以DeepSeek系列服務器為例,分享智能算力設備在真實運維場景中的創新應用。 一、傳統服務器集群的運維痛點 在數據…

安裝部署RabbitMQ

一、RabbitMQ安裝部署 1、下載epel源 2、安裝RabbitMQ 3、啟動RabbitMQ web管理界面 啟用插件 rabbitmq數據目錄 創建rabbitmq用戶 設置為管理員角色 給用戶賦予權限 4、訪問rabbitmq

中間件--ClickHouse-4--向量化執行(什么是向量?為什么向量化執行的更快?)

1、向量(Vector)的概念 (1)、向量的定義 向量:在計算機科學中,向量是一組同類型數據的有序集合,例如一個包含多個數值的數組。在數據庫中,向量通常指批量數據(如一列數…

Python PDF 轉 Markdown 工具庫對比與推薦

根據最新評測及開源社區實踐,以下為綜合性能與適用場景的推薦方案: 1. ?Marker? ?特點?: 轉換速度快,支持表格、公式(轉為 LaTeX)、圖片提取,適配復雜排版文檔?。依賴 PyTorch&#xff0c…

Vue 和 Spring boot 和 Bean 不同生命周期

一、Vue 組件生命周期 父子組件生命周期順序: 創建時: 父 beforeCreate → 父 created → 父 beforeMount → 子組件生命周期 → 父 mounted 更新時: 父 beforeUpdate → 子組件更新 → 父 updated。 銷毀時: 父 beforeDestroy…

Microsoft Azure 基礎知識簡介

Microsoft Azure 基礎知識簡介 已完成100 XP 2 分鐘 Microsoft Azure 是一個云計算平臺,提供一系列不斷擴展的服務,可幫助你構建解決方案來滿足業務目標。 Azure 服務支持從簡單到復雜的一切內容。 Azure 具有簡單的 Web 服務,用于在云中托…