Redisson分布式鎖、可重入鎖

介紹Redisson

什么是 Redisson?來自于官網上的描述內容如下!

Redisson 是一個在 Redis 的基礎上實現的 Java 駐內存數據網格客戶端(In-Memory Data Grid)。它不僅提供了一系列的 redis 常用數據結構命令服務,還提供了許多分布式服務,例如分布式鎖、分布式對象、分布式集合、分布式遠程服務、分布式調度任務服務等等。

相比于 Jedis、Lettuce 等基于 redis 命令封裝的客戶端,Redisson 提供的功能更加高端和抽象

配置Redisson

引入依賴

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

配置客戶端類

@Configuration
public class RedisConfig {@Beanpublic RedissonClient redissonClient(){Config config = new Config();//添加了單機redis地址,也可以使用useClusterServers()添加集群地址config.useSingleServer().setAddress("redis://192.168.2.129:6379").setPassword("linux02");return Redisson.create(config);}
}

?使用Redisson分布式鎖

Long id = UserHolder.getUser().getId();RLock redisLock = redissonClient.getLock("lock:order:" + id);//嘗試獲取鎖boolean tryLock = redisLock.tryLock();//判斷鎖是否獲取成功if (!tryLock){return Result.fail("不允許重復下單");}try {//鎖加到這里,事務提交后才釋放鎖//獲取事務的動態代理對象,需要在啟動類加注解暴漏出對象IVoucherOrderService proxy = (IVoucherOrderService)AopContext.currentProxy();//拿到動態代理對象return proxy.createVoucherOrder(voucherId, voucher);//使用動態代理類的對象,事務可以生效} finally {redisLock.unlock();}

不可重入鎖

在同一個線程中,method1獲取鎖后,調用method2,method2中嘗試獲取鎖,此時鎖已經被method1獲取,則method2獲取鎖失敗,這就是不可重入鎖,前面實現的鎖就是不可重入鎖!

Redisson可重入鎖

????????可重入鎖,從字面來理解,就是可以重復進入的鎖,也叫做遞歸鎖,指的是同一線程外層函數獲得鎖之后,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響。

????????ReentrantLocksynchronized都是可重入鎖。

????????在一個類中,如果synchronized方法1調用了synchronized方法2,方法2是可以正常執行的,這說明synchronized是可重入鎖。否則,在執行方法2想獲取鎖的時候,該鎖已經在執行方法1時獲取了,那么方法2將永遠得不到執行。

?為了實現可重入鎖,redis中使用hash類型不再使用string類型,為什么要使用hash類型,就不得不說到Redisson可重入鎖在redis中的實現原理:

實現原理 :?? ? ??

????????在同一線程中,method1成功獲取鎖后調用method2,method2也嘗試獲取鎖,此時要先判斷method2所在線程和method1所在線程是否是同一線程,若是,則method2也獲取鎖成功,它和method1顯然獲取了同一個鎖,那么該鎖被獲取次數+1,而這個鎖被獲取的次數我們需要記錄,也就是說value不僅要記錄 線程名 還要記錄 鎖被獲取的次數,那么我們就由此采用hash類型更合理!

為什么記錄鎖被獲取的次數?

一個業務的完成可能要多次獲取鎖,如一個業務中執行了method1,method1調用了method2,method2調用了method3,這三個方法都加同一個鎖(可重入鎖),當method3執行完后,并不能立刻釋放method3的鎖,而是鎖被獲取的次數-1因為鎖是共享的,此時method1和method2還沒執行完不能釋放鎖,那么什么時候釋放鎖?當然是鎖被獲取的次數減為0了,說明此時已經沒有方法獲取鎖,那么可以安全的釋放可重入鎖了。

So鎖被獲取的次數就是我們判斷是否要釋放鎖的依據!

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

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

相關文章

力扣56.合并區間

力扣56.合并區間 按左端點排序 判斷左端點是否小于等于當前右端點**&#xff08;可以合并&#xff09;** class Solution {public:vector<vector<int>> merge(vector<vector<int>>& intervals) {ranges::sort(intervals);vector<vector<i…

北森銳途人才競聘盤點管理測評:高管領導力六大評判標準深度解析萬達商管中國綠發等

北森銳途人才管理測評&#xff1a;高管領導力評判標準深度解析 在企業高管的盤點與競聘測評領域&#xff0c;眾多管理人才面臨評估自身領導力的挑戰。面對能力卓越、職級顯赫的同僚&#xff0c;許多管理者感到缺乏一套權威且專業的評價體系。然而&#xff0c;無論是天賦異稟的領…

vue+cesium之加載天地圖影像底圖與注記

目錄 1.創建地圖容器2.疊加天地圖影像底圖與矢量注記 關鍵代碼3.示例效果圖 Cesium是默認加載了微軟公司的Bing地圖&#xff0c;并提供了BingMapslmageryProvider類來加載Bing地圖。也就是說&#xff0c;在創建Viewer時&#xff0c;如果不指定lmageryProvider類就默認加載Bing地…

一體化預制泵站如何選擇廠家及設備選型

諸城市鑫淼環保小編帶大家了解一下一體化預制泵站如何選擇廠家及設備選型 一體化預制泵站是由玻璃鋼筒體、格柵系統、水泵、內部管道、閥門、液位控制儀、進出水管道、檢修平臺、照明系統、不銹鋼爬梯等組成。該設備的型號是多種多樣的&#xff0c;設備的型號不同&#xff0c;其…

2024年7月2日~2024年7月8日周報

目錄 一、前言 二、完成情況 2.1 吳恩達機器學習系列課程 2.1.1 分類問題 2.1.2 假說表示 2.1.3 判定邊界 2.2 學習數學表達式 2.3 論文寫作情況 2.3.1 題目選取 2.3.2 摘要 2.3.3 關鍵詞 2.3.4 引言部分 2.3.4 文獻綜述部分 三、下周計劃 3.1 存在的問題 3.2 …

C語言之數據在內存中的存儲(1),整形與大小端字節序

目錄 前言 一、整形數據在內存中的存儲 二、大小端字節序 三、大小端字節序的判斷 四、字符型數據在內存中的存儲 總結 前言 本文主要講述整型包括字符型是如何在內存中存儲的&#xff0c;涉及到大小端字節序這一概念&#xff0c;還有如何判斷大小端&#xff0c;希望對大…

2、需求工具 - 編程實戰工具系列文章

需求分析工具 筆者對于需求分析工具的應用&#xff0c;主要是思維導圖軟件和Word。思維導圖用來理清需要的需求功能&#xff0c;而Word用來記錄每個需求功能的實際內容。 對于思維導圖軟件&#xff0c;筆者用過幾個&#xff0c;但是有些需要注冊碼&#xff0c;有些需要費用&…

谷粒商城學習-09-配置Docker阿里云鏡像加速及各種docker問題記錄

文章目錄 一&#xff0c;配置Docker阿里云鏡像加速二&#xff0c;Docker安裝過程中的幾個問題1&#xff0c;安裝報錯&#xff1a;Could not resolve host: mirrorlist.centos.org; Unknown error1.1 檢測虛擬機網絡1.2 重設yum源 2&#xff0c;報錯&#xff1a;Could not fetch…

Redis基礎教程(十五):Redis GEO地理信息查詢與管理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;歡迎各位來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里不僅可以有所收獲&#xff0c;同時也能感受到一份輕松歡樂的氛圍&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

絕區伍--2024年AI發展路線圖

2024 年將是人工智能具有里程碑意義的一年。隨著新模式、融資輪次和進步以驚人的速度出現&#xff0c;很難跟上人工智能世界發生的一切。讓我們深入了解 2024 年可能定義人工智能的關鍵事件、產品發布、研究突破和趨勢。 2024 年第一季度 2024 年第一季度將推出一些主要車型并…

【React Hooks原理 - useEffect、useLayoutEffect】

介紹 在實際React Hooks項目中&#xff0c;我們需要在項目的不同階段進行一些處理&#xff0c;比如在頁面渲染之前進行dom操作、數據獲取、第三方加載等。在Class Component中存在很多生命周期能讓我們完成這個操作&#xff0c;但是在React Hooks沒有所謂的生命周期&#xff0…

python - 類和對象

一.類 類名用大寫字母開頭 屬性是類中的變量&#xff0c;方法是類中的函數 類、class關鍵字&#xff1a; >>> class Turtle: ... color green ... weight 10 ... legs 4 ... shell True ... mount 大嘴 ... def climb(self): ... …

從零開始讀RocketMq源碼(二)Message的發送詳解

目錄 前言 準備 消息發送方式 深入源碼 消息發送模式 選擇發送方式 同步發送消息 校驗消息體 獲取Topic訂閱信息 高級特性-消息重投 選擇消息隊列-負載均衡 裝載消息體發送消息 壓縮消息內容 構造發送message的請求的Header 更新broker故障信息 異步發送消息 …

Open3D KDtree的建立與使用

目錄 一、概述 1.1kd樹原理 1.2kd樹搜索原理 1.3kd樹構建示例 二、常見的領域搜索方式 2.1K近鄰搜索&#xff08;K-Nearest Neighbors, KNN Search&#xff09; 2.2半徑搜索&#xff08;Radius Search&#xff09; 2.3混合搜索&#xff08;Hybrid Search&#xff09; …

ai native 模型微調

AI native 模型微調&#xff08;fine-tuning&#xff09;是指在預訓練模型的基礎上&#xff0c;通過對其參數進行進一步訓練&#xff0c;使其在特定任務上表現更佳。以下是關于模型微調的一些基本步驟和概念&#xff1a; ### 1. 準備數據集 - **數據收集**&#xff1a;收集適用…

后端之路——登錄校驗前言(Cookie\ Session\ JWT令牌)

前言&#xff1a;Servlet 【登錄校驗】這個功能技術的基礎是【會話技術】&#xff0c;那么在講【會話技術】的時候必然要談到【Cookie】和【Session】這兩個東西&#xff0c;那么在這之前必須要先講一下一個很重要但是很多人都會忽略的一個知識點&#xff1a;【Servlet】 什么是…

Oracle PL/SQL 循環批量執行存儲過程

1. 查詢存儲過程 根據數據字典USER_OBJECTS查詢出所有存儲過程。 2. 動態拼接字符串&#xff08;參數等&#xff09; 根據數據字典USER_ARGUMENTS動態拼接參數。 3. 動態執行 利用EXECUTE IMMEDIATE動態執行無名塊。 4. 輸出執行信息 利用DBMS_OUTPUT.PUT_LINE輸出執行成功與…

Android Gradle 開發與應用 (十): Gradle 腳本最佳實踐

目錄 1. 使用Gradle Kotlin DSL 1.1 什么是Gradle Kotlin DSL 1.2 遷移到Kotlin DSL 1.3 優勢分析 2. 優化依賴管理 2.1 使用依賴版本管理文件 2.2 使用依賴分組 3. 合理使用Gradle插件 3.1 官方插件和自定義插件 3.2 插件管理的最佳實踐 4. 任務配置優化 4.1 使用…

Oracle 19c 統一審計表清理

zabbix 收到SYSAUX表空間告警超過90%告警&#xff0c;最后面給出的清理方法只適合ORACLE 統一審計表的清理&#xff0c;傳統審計表的清理SYS.AUD$不適合&#xff0c;請注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…

STM32實戰篇:閃燈 × 流水燈 × 蜂鳴器

IO引腳初始化 即開展某項活動之前所做的準備工作&#xff0c;對于一個IO引腳來說&#xff0c;在使用它之前必須要做一些參數配置&#xff08;例如&#xff1a;選擇工作模式、速率&#xff09;的工作&#xff08;即IO引腳的初始化&#xff09;。 IO引腳初始化流程 1、使能IO引…