Java集成Redisson實現分布式鎖(實戰)

一、Redisson是什么

Redisson 是一個基于 Redis 實現的 Java 駐內存數據網格(In-Memory Data Grid)。它不僅提供了一系列分布式和可擴展的 Java 數據結構,還對 Redis 進行了封裝,讓開發者可以更便捷地使用 Redis。

二、Redisson作用

  1. 簡化 Redis 操作:Redisson 為 Java 開發者提供了一套直觀且易于使用的 API,能把 Redis 當作普通的 Java對象或集合來操作,從而減少了與 Redis 交互時的復雜度。例如,你可以像操作 Java 的Map一樣操作 Redis 中的哈希表。
  2. 分布式鎖和同步機制:Redisson實現了多種分布式鎖和同步工具,如可重入鎖、公平鎖、讀寫鎖等,能確保在分布式環境下多個節點之間的數據一致性和并發控制。
  3. 豐富的數據結構:它提供了分布式的Map、List、Set、Queue等數據結構,這些結構在分布式系統中能被多個節點共享和操作。
  4. 異步和反應式編程支持:Redisson 支持異步和反應式編程模型,可提升應用程序的性能和響應能力。

三、使用場景

  1. 分布式鎖:在分布式系統中,多個服務可能會同時訪問和修改共享資源,使用 Redisson 的分布式鎖可以保證同一時間只有一個服務能夠操作該資源,避免數據沖突。例如,在電商系統中,多個訂單服務可能同時處理庫存扣減的操作,使用分布式鎖可以確保庫存數據的準確性。
  2. 分布式集合:當需要在多個服務之間共享數據時,可以使用 Redisson的分布式集合。比如,在一個分布式的消息系統中,多個消費者服務可以通過分布式隊列來處理消息。
  3. 分布式緩存:利用 Redisson 的分布式Map可以實現分布式緩存,將經常訪問的數據存儲在 Redis 中,減少數據庫的訪問壓力,提高系統的性能。例如,在一個高并發的 Web 應用中,可以將用戶的基本信息緩存在 Redis 中,當用戶訪問時直接從緩存中獲取數據。
  4. 分布式信號量:在分布式系統中,信號量可用于控制對有限資源的訪問。例如,在一個分布式的文件上傳系統中,可以使用信號量來限制同時上傳的文件數量。

四、使用

1、引入依賴:

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>${redisson.version}</version>  <!--版本號根據項目適配-->
</dependency>

3、配置文件

# 數據源配置
spring:# redis 配置redis:# 地址host: 127.0.0.1# 端口,默認為6379port: 6379# 數據庫索引database: 5# 密碼password: # 連接超時時間timeout: 60slettuce:pool:# 連接池中的最小空閑連接min-idle: 0# 連接池中的最大空閑連接max-idle: 8# 連接池的最大數據庫連接數max-active: 8# #連接池最大阻塞等待時間(使用負值表示沒有限制)max-wait: -1ms

3、配置類:

@Component
@RefreshScope
public class RedissonConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private String port;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.database}")private Integer database;@Beanpublic RedissonClient redissonClient() {// 創建配置 指定redis地址及節點信息Config config = new Config();//單例模式config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password) // redis設置了密碼,就需設置.setDatabase(database);// 根據config創建出RedissonClient實例并返回return Redisson.create(config);}
}

4、工具

@Slf4j
@Component
public class RedissonLock {@Resourceprivate RedissonClient redissonClient;/*** lock(), 拿不到lock就不罷休,不然線程就一直block*/public RLock lock(String key) {if (StringUtils.isBlank(key)) {return null;}RLock lock = redissonClient.getLock(key);try {lock = redissonClient.getLock(key);} catch (Exception e) {log.error("Failed to acquire lock for key: " + key, e);}return lock;}/*** leaseTime為加鎖時間,單位為秒* @param key key* @param leaseTime 為加鎖時間,單位為秒*/public RLock lock(String key, long leaseTime) {if (StringUtils.isBlank(key) || leaseTime <= 0) {return null;}RLock lock = redissonClient.getLock(key);try {lock.lock(leaseTime, TimeUnit.SECONDS);} catch (Exception e) {log.error("Failed to acquire lock for key: " + key, e);}return lock;}/*** timeout為加鎖時間,時間單位由unit確定*/public RLock lock(String key, TimeUnit unit, long timeout) {if (StringUtils.isBlank(key) || timeout <= 0 || unit == null) {return null;}RLock lock = redissonClient.getLock(key);try {lock.lock(timeout, unit);} catch (Exception e) {log.error("Failed to acquire lock for key: " + key, e);}return lock;}/*** @param lockKey   鎖 key* @param unit      單位* @param waitTime  等待時間* @param leaseTime 鎖有效時間* @return 加鎖成功? true:成功 false: 失敗*/public boolean tryLock(String lockKey, TimeUnit unit, long waitTime, long leaseTime) {RLock lock = redissonClient.getLock(lockKey);try {return lock.tryLock(waitTime, leaseTime, unit);} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("加鎖失敗: " + e.getMessage());return false;} catch (Exception e) {log.error("加鎖過程中發生異常: " + e.getMessage());return false;}}/*** unlock** @param lockKey key*/public void unlock(String lockKey) {RLock lock = redissonClient.getLock(lockKey);if (lock.isLocked() && lock.isHeldByCurrentThread()) {lock.unlock();}}/*** unlock** @param lock 鎖*/public void unlock(RLock lock) {lock.unlock();}
}

5、例子

@RestController
@Slf4j
public class RedissonController {@Resourceprivate RedissonLock redissonLock;@GetMapping("lockTest")public void lockTest(String key) {try {// 加鎖redissonLock.lock(key);System.out.println("獲取到鎖,開始執行任務");// 模擬業務操作Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();} finally {// 釋放鎖redissonLock.unlock(key);System.out.println("任務執行完畢,釋放鎖");}
}

總結

Lock和tryLock的區別
在這里插入圖片描述

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

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

相關文章

linux的例行性工作(at)

使用場景&#xff1a; 生活中&#xff0c;我們有太多場景需要使用到鬧鐘&#xff0c;比如早上 7 點起床&#xff0c;下午 4 點開會&#xff0c;晚上 8 購物&#xff0c;等等 在 Linux 系統里&#xff0c;我們同樣也有類似的需求。比如我們想在凌晨 1 點將文件上傳服務器&#…

AAAI2016論文 UCO: A Unified Cybersecurity Ontology

作者信息 作者同樣是來自馬里蘭大學的。 嚴格說來&#xff0c;此文是Workshop論文&#xff0c;但是一篇非常經典的文章&#xff08;極少數嘗試構造通用安全本體的文章&#xff09;&#xff0c;引用非常多。 中心思想 設計UCO&#xff0c;集成來自不同網絡安全系統的異構數據…

【白雪講堂】構建與優化企業知識圖譜的實戰指南

在GEO&#xff08;生成式引擎優化&#xff09;時代&#xff0c;知識圖譜不僅是企業數據資產的“智慧大腦”&#xff0c;更是連接內容與AI理解之間的核心橋梁。一個高質量的知識圖譜&#xff0c;能夠顯著提高AI平臺對企業內容的識別度、相關性與推薦權重&#xff0c;從而在AI搜索…

什么是WebSocket?NGINX如何支持WebSocket協議?

大家好&#xff0c;我是鋒哥。今天分享關于【什么是WebSocket&#xff1f;NGINX如何支持WebSocket協議&#xff1f;】面試題。希望對大家有幫助&#xff1b; 什么是WebSocket&#xff1f;NGINX如何支持WebSocket協議&#xff1f; 1000道 互聯網大廠Java工程師 精選面試題-Java…

【免費項目分享】(項目加說明文檔)基于Go語言的城市電動汽車充電樁管理系統設計與實現

免費項目分享系列&#xff0c;需要的可后臺 基于Go語言的城市電動汽車充電樁管理系統設計與實現 技術&#xff1a;Go、Beego框架、Vue、MySQL 地址&#xff1a;https://download.csdn.net/download/weixin_53920044/90697080 用戶功能 1.充電樁搜索與導航&#xff1a;用戶可以…

線程池單例模式

線程池的概念 線程池是一種線程使用模式。 一種線程使用模式。線程過多會帶來調度開銷&#xff0c;進而影響緩存局部性和整體性能。而線程池維護著多個線程&#xff0c;等待著監督管理者分配可并發執行的任務。…

【Android Compose】焦點管理

官方文檔鏈接&#xff1a; https://developer.android.google.cn/develop/ui/compose/touch-input/focus?hlzh-cn 1、更改焦點遍歷順序 1.1、替換一維遍歷順序 &#xff08;1&#xff09;創建焦點引用對象&#xff1a; /// 創建4個引用對象&#xff08;二選一&#xff09…

dwj2025426

目錄 一、25. K 個一組翻轉鏈表 - 力扣&#xff08;LeetCode&#xff09; 二、 215. 數組中的第K個最大元素 - 力扣&#xff08;LeetCode&#xff09; 三、 15. 三數之和 - 力扣&#xff08;LeetCode&#xff09; 一、25. K 個一組翻轉鏈表 - 力扣&#xff08;LeetCode&#…

C++ std::forward 詳解

在 C 11 引入的眾多特性中&#xff0c;std::forward占據著獨特且重要的地位。它主要用于實現所謂的 “完美轉發”&#xff0c;這一機制在現代 C 編程中發揮著關鍵作用&#xff0c;尤其是在編寫通用庫和高效代碼時。 什么是完美轉發&#xff1f; 完美轉發是指在函數模板中&…

如何保證線程安全(含典型手段與應用場景)

? 1. 什么是線程安全&#xff1f; 線程安全指的是&#xff1a;當多個線程同時訪問同一塊代碼時&#xff0c;無論運行時環境采用怎樣的調度方式或者這些線程將怎樣交替執行&#xff0c;代碼的行為都能正確執行&#xff0c;且不會出現數據不一致、臟數據或異常崩潰。 舉個簡單…

Qt/C++開發監控GB28181系統/協議解釋說明/SIP內容解釋/每一行數據什么含義

一、前言 搞gb28181開發&#xff0c;首要任務就是解析協議&#xff0c;按照gb28181的文檔來&#xff0c;還是非常詳細的&#xff0c;通過抓包工具可以查看到具體的收發數據&#xff0c;也可以打開網絡調試助手工具&#xff0c;監聽5060端口&#xff0c;看到上報的數據&#xf…

C++:string 1

練習題&#xff1a; 這個題的思路是從前往后&#xff0c;從后往前同時找&#xff0c;不是字母的話就繼續&#xff0c;是的話就交換。 代碼&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <string> using namespace std; //1、4個…

SMT貼片加工費控制與優化實踐指南

內容概要 SMT貼片加工費的控制與優化需建立在對成本結構的系統性認知基礎上。本節從物料采購、設備運行、工藝參數三大維度切入&#xff0c;結合BOM清單管理、鋼網使用規范等實操環節&#xff0c;構建覆蓋全流程的降本增效框架。以下表格列舉了SMT加工成本的典型構成要素及其占…

未來醫院已來:AI如何實現無死角安全監控

AI智慧醫院如何用算法守護安全與效率 ## 背景&#xff1a;醫療場景的智能化轉型需求 現代醫院作為人員密集、場景復雜的公共場所&#xff0c;面臨諸多管理痛點&#xff1a;患者跌倒可能延誤救治、醫鬧事件威脅安全、醫療垃圾處置不當引發感染風險、重點區域&#xff08;如藥…

Nuxt3中使用UnoCSS指南

Nuxt3中使用UnoCSS指南 UnoCSS是一個高度可定制的、原子化CSS引擎&#xff0c;可以輕松集成到Nuxt3項目中。下面介紹如何在Nuxt3中安裝和配置UnoCSS。 安裝步驟 安裝UnoCSS的Nuxt模塊&#xff1a; # 使用pnpm pnpm add -D unocss unocss/nuxt# 使用yarn yarn add -D unocss…

mmap詳解

mmap詳解 mmap基礎概念mmap內存映射原理mmap相關函數調用mmap的使用細節mmap和常規文件操作的區別 mmap基礎概念 mmap是一種內存映射文件的方法&#xff0c;即將一個文件或者其它對象映射到進程的地址空間&#xff0c;實現文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一…

Vue3的內置組件 -實現過渡動畫 TransitionGroup

Vue3的內置組件 -實現過渡動畫 TransitionGroup 是一個內置組件&#xff0c;用于對 v-for 列表中的元素或組件的插入、移除和順序改變添加動畫效果 支持和 基本相同的 props、CSS 過渡 class 和 JavaScript 鉤子監聽器&#xff0c;但有以下幾點區別&#xff1a; 默認情況下&…

【軟考-架構】14、軟件可靠性基礎

?資料&文章更新? GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目錄 軟件可靠性基本概念軟件可靠性建模軟件可靠性管理軟件可靠性設計N版本程序設計恢復塊設計&#xff08;動態冗余&#xff09;雙機容錯技術、集群技術負載均衡軟件可靠性測試…

使用Python+OpenCV對視頻抽幀保存為JPG圖像

使用PythonOpenCV對視頻抽幀保存為JPG圖像 import os import cv2 import time#視頻文件夾路徑&#xff0c;可修改 videoPath D:\\video\\ #保存的圖片文件夾路徑&#xff0c;可修改 savePath D:\\images\\ videolist os.listdir(videoPath) if not os.path.exists(savePath…

學習整理在centos7上安裝mysql8.0版本教程

學習整理在centos7上安裝mysql8.0版本教程 查看linux系統版本下載mysql數據庫安裝環境檢查解壓mysql安裝包創建MySQL需要的目錄及授權新增用戶組新增組用戶配置mysql環境變量編寫MySQL配置文件初始化數據庫初始化msyql服務啟動mysql修改初始化密碼配置Linux 系統服務工具,使My…