Redisson 實現分布式鎖

? ? ? ? 在平常的開發工作中,我們經常會用到鎖,那么鎖有什么用呢?鎖主要是控制對共享資源的訪問順序,防止多個線程并發操作導致數據不一致的問題。經常可能會聽到樂觀鎖、悲觀鎖、分布式鎖、行鎖、表鎖等等,那么我們今天總結下分布式鎖的實現方式之Redisson。

? ? ?一:概述

? ? ? ? 提到分布式鎖,我們先說說什么是鎖?鎖就是為了避免多個線程同時訪問某個共享資源時,修改了數據,導致出現數據一致性。鎖好比一個房間只能進去一個人辦理事情,得等里面的人出來,其他人才能進去。那么什么是分布式鎖呢?分布式鎖就是在分布式項目中使用的鎖。說到這兒,那就說說什么是分布式。分布式系統是指由多個節點、通過網絡連接,共同完成任務的系統。如一個系統由用戶服務、訂單服務、支付服務、倉儲服務等組成,之間通過網絡通信調用,那么就是分布式系統。

? ? ?二:分布式鎖特點

? ? ? ? 1:互斥性:同一時刻只有一個客戶端(進程或線程)能夠持有鎖。
? ? ? ? 2:可重入性:同一個客戶端在已經持有鎖的情況下,可以再次獲取該鎖而不會被阻塞。
? ? ? ? 3:容錯性:如客戶端崩潰、網絡中斷等。當客戶端在持有鎖的過程中出現異常崩潰時,鎖能夠自動釋放,避免出現死鎖的情況。
? ? ? ? 4:高可用:有良好的獲取鎖與釋放鎖的功能,避免分布式鎖失效。

? ? 三:分布式鎖應用場景

? ? ? ?1:電商系統中秒殺、庫存扣減,防止超賣。
???????2:分布式任務執行,先獲取鎖,再執行任務,保證數據一致性。
???????3:分布式系統冪等,如支付回調、消息消費等。

? ? ?四:代碼實現

? ? ?1:引入依賴

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

? ? ?2:application.yml? redis 配置

  data:redis:# 連接地址host: 127.0.0.1# 端口port: 6379# 數據庫database: 0# 用戶名# username: redis# 密碼password: 123456# 連接超時connect-timeout: 5s# 讀超時timeout: 30s

? ? ? 3:RedissonConfig

????????RedissonConfig 主要作用是對 Redisson 客戶端進行配置和初始化。

import org.redisson.Redisson;
import org.springframework.beans.factory.annotation.Value;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedissonConfig {@Value("${spring.data.redis.host}")private String redisHost;@Value("${spring.data.redis.port}")private int redisPort;@Value("${spring.data.redis.password}")private String password;@Value("${spring.data.redis.database}")private int database;@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort).setDatabase(database).setPassword(password);return Redisson.create(config);}

? ? ? 4:鎖實現

import cn.hutool.extra.spring.SpringUtil;
import com.ruoyi.system.service.ILockforService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;/*** 商品實現類*/
@Service
@Slf4j
public class SysLockforServiceImpl implements ILockforService{@Resourceprivate RedissonClient redissonClient;@Overridepublic void addGoods() {// 定義鎖的鍵String lockKey = "addGoodsLock";// 獲取分布式鎖實例// 如果在靜態方法中,無法注入,通過如下獲取 bean//RedissonClient redissonClient = SpringUtil.getBean(RedissonClient.class);RLock lock = redissonClient.getLock(lockKey);try {// 嘗試獲取鎖,等待 1 秒,鎖的過期時間為 1 秒boolean isLocked1 = lock.tryLock(1, 5, TimeUnit.SECONDS);// 嘗試獲取鎖,等待 0 秒,即沒有獲取到會立即返回,沒有設置鎖的過期時間,則不會自動釋放鎖,釋放鎖需要手動控制// boolean isLocked2 = lock.tryLock(0, TimeUnit.SECONDS);if (!isLocked1) {log.info("未獲取到鎖,請稍后再試!");}// 模擬業務邏輯log.info("開始處理業務");log.info("處理業務結束");} catch (Exception e) {log.error("新增商品異常", e);} finally {// 釋放鎖lock.unlock();}}

? ? ? 5:鎖的過期時間

? ? ? ? 如果設置了過期時間,在到達過期時間后,鎖會釋放。如果未設置鎖的過期時間,則需要在代碼中手動釋放鎖。
????????如果持有鎖的客戶端在獲取鎖之后發生異常關閉(例如程序崩潰、服務器宕機等),由于 Redisson 底層是基于 Redis 實現的,Redis 中存儲的鎖鍵值對可能會一直存在,導致其他客戶端無法獲取該鎖,形成死鎖。不過,Redisson 為了避免這種情況,有一個看門狗(Watchdog)機制。
????????看門狗機制會在客戶端獲取鎖時自動為鎖設置一個默認的過期時間(默認是 30 秒),并且會在后臺啟動一個定時任務,不斷地延長鎖的過期時間,只要客戶端還持有鎖且沒有手動釋放。但如果客戶端異常關閉,定時任務無法繼續執行,鎖會在過期時間到達后自動釋放。
????????正常情況下使用 tryLock(0, TimeUnit.SECONDS) 需要手動釋放鎖,但在客戶端異常關閉的情況下,看門狗機制會保證鎖最終能夠自動釋放。

? ? ?五:總結

? ? ? ? 實現 Redisson 分布式鎖,主要是引入依賴,在 application.yml 中配置 redis 連接信息,配置 RedissonConfig,實現分布式鎖。

? ? ? ? 可能遇到的問題,如果未配置 RedissonConfig,則會注入異常,如下:

? ? ? ? 以上為 Redisson 實現分布式鎖的主要步驟。

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

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

相關文章

環境—Ubuntu24(py3.12)安裝streamlit(虛擬環境py3.9)

請盡可能不用Ubuntu24請直接跳7.查看解決方案 Action Log 在Ubuntu 24.04中更換為清華源的步驟【Bug】Python 3.12 on Ubuntu 24.04 is Externally Managed - PIP is broken 相關解決方案 從 Ubuntu 24.04 開始&#xff0c;有兩個選項&#xff1a; 1. install python pacakg…

【C++進階】關聯容器:set類型

目錄 一、set 基本概念 1.1 定義與特點 1.2 頭文件與聲明 1.3 核心特性解析 二、set 底層實現 2.1 紅黑樹簡介 2.2 紅黑樹在 set 中的應用 三、set 常用操作 3.1 插入元素 3.2 刪除元素 3.3 查找元素 3.4 遍歷元素 3.5 性能特征 四、set 高級應用 4.1 自定義比較…

[漏洞篇]SSRF漏洞詳解

[漏洞篇]SSRF漏洞詳解 免責聲明&#xff1a; 本文主要講解漏洞原理&#xff0c;以及防御手段&#xff0c;旨在幫助大家更好的了解漏洞危害&#xff0c;以及開發中所需要的點&#xff0c;切勿拿來做違法事情&#xff0c;否則后果自負。 一、介紹 概念 SSRF&#xff1a;服務端請…

nuscenes數據集分析

nuscenes數據集分析 標注與總體介紹 nuscenes包含有相機、激光雷達、毫米波雷達、IMU與GPS等設備提供的數據。它的數據采集了1000個場景&#xff0c;每個場景大約有20s&#xff0c;針對目標檢測任務&#xff0c;對23類物體進行標注&#xff0c;且以2Hz的頻率提供精確的三維目標…

JavaScript學習教程,從入門到精通,JavaScript 運算符及語法知識點詳解(8)

JavaScript 運算符及語法知識點詳解 一、JavaScript 運算符 1. 算術運算符 用于執行數學運算&#xff1a; 加法- 減法* 乘法/ 除法% 取模&#xff08;余數&#xff09; 遞增-- 遞減** 冪運算&#xff08;ES6&#xff09; let a 10, b 3; console.log(a b); // 13 conso…

Shell腳本的學習

編寫腳本文件 定義以開頭&#xff1a;#!/bin/bash #!用來聲明腳本由什么shell解釋&#xff0c;否則使用默認shel 第一步&#xff1a;編寫腳本文件 #!/bin/bash #注釋 echo "這是輸出" 第二步&#xff1a;加上執行權限&#xff1a;chmod x 腳本文件名.sh 第三步&…

在線PDF文件拆分工具,小白工具功能實用操作簡單,無需安裝的文檔處理工具

小白工具中的在線 PDF 文件拆分工具是一款功能實用、操作便捷的文檔處理工具&#xff0c;以下是其具體介紹&#xff1a; 操作流程 上傳 PDF 文檔&#xff1a;打開小白工具在線PDF文件拆分工具 - 快速、免費拆分PDF文檔 - 小白工具的在線 PDF 文件拆分頁面&#xff0c;通過點擊 …

數字的乘階運算

求數字的乘階&#xff1a; 例如&#xff1a;6的乘階運算&#xff1a;6*5*4*3*2*1 例如&#xff1a;3的乘階運算&#xff1a;3*2*1 class Program{static void Main(string[] args){Console.WriteLine("請輸入數字&#xff1a;");int num_01 Convert.ToInt32 (Con…

tcp/ip攻擊及防范

作為高防工程師&#xff0c;我每天攔截數以萬計的惡意流量&#xff0c;其中TCP/IP協議層攻擊是最隱蔽、最具破壞性的威脅之一。常見的攻擊手法包括&#xff1a; 1. SYN Flood攻擊&#xff1a;攻擊者發送大量偽造的SYN包&#xff0c;耗盡服務器連接資源&#xff0c;導致正常用…

C++類成員內存分布詳解

本文將探討C類中成員變量的內存分布情況&#xff0c;包括普通成員、靜態成員、虛函數等不同情況下的內存布局。 一、基本成員內存布局 1. 普通成員變量 普通成員變量按照聲明順序在內存中連續排列&#xff08;受訪問修飾符和內存對齊影響&#xff09;&#xff1a; class Nor…

計算機視覺——為什么 mAP 是目標檢測的黃金標準

概述 在目標檢測領域&#xff0c;有一個指標被廣泛認為是衡量模型性能的“黃金標準”&#xff0c;它就是 mAP&#xff08;Mean Average Precision&#xff0c;平均精確率均值&#xff09;。如果你曾經接觸過目標檢測模型&#xff08;如 YOLO、Faster R-CNN 或 SSD&#xff09;…

C語言單鏈表的增刪改補

目錄 &#xff08;一&#xff09;單鏈表的結構定義及初始化 (二)單鏈表的尾插&#xff0c;頭插 (三)單鏈表的尾刪&#xff0c;頭刪 (四)單鏈表的查找&#xff0c;刪除&#xff0c;銷毀 單鏈表是數據結構課程里的第二個數據結構。單鏈表在邏輯結構是連續的&#xff0c;在物理…

Android10.0 framework第三方無源碼APP讀寫斷電后數據丟失問題解決

1.前言 在10.0中rom定制化開發中,在某些產品開發中,在某些情況下在App用FileOutputStream讀寫完畢后,突然斷電 會出現寫完的數據丟失的問題,接下來就需要分析下關于使用FileOutputStream讀寫數據的相關流程,來實現相關 功能 2.framework第三方無源碼APP讀寫斷電后數據丟…

殺戮尖塔(Slay The Spire) 的全新角色模組 - 女巫

女巫&#xff08;The Witch&#xff09; 殺戮尖塔&#xff08;Slay The Spire&#xff09; 的全新角色模組 女巫模組為游戲增添了超過 75 張新卡牌和 4 個全新遺物&#xff0c;圍繞 詛咒&#xff08;Curses&#xff09; 展開獨特的玩法體驗。她的起始遺物 黑貓&#xff08;Bl…

AI開發學習路線(闖關升級版)

以下是一份輕松版AI開發學習路線&#xff0c;用「闖關升級」的方式幫你從零開始變身AI開發者&#xff0c;每個階段都配有有趣的任務和實用資源&#xff0c;保證不枯燥、可落地&#xff01;&#x1f447; 目錄 &#x1f530; 新手村&#xff1a;打基礎&#xff08;1-2個月&…

迭代器模式深度解析與實戰案例

一、模式定義 迭代器模式&#xff08;Iterator Pattern&#xff09; 是一種行為設計模式&#xff0c;提供一種方法順序訪問聚合對象的元素&#xff0c;無需暴露其底層表示。核心思想是將遍歷邏輯從聚合對象中分離&#xff0c;實現 遍歷與存儲的解耦。 二、核心組件 組件作用…

SSH遠程工具

一、常見SSH遠程工具 工具開源跨平臺多標簽文件傳輸高級功能價格Xshell?Win????腳本、會話管理免費/商業版Tabby??全平臺????插件擴展免費MobaXterm?Win????集成工具集免費/付費SecureCRT?Win/macOS/Linux????企業級加密$129+PuTTY??全平臺??基礎連接…

VUE中的路由處理

1.引入,預處理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由規…

編程助手fitten code使用說明(超詳細)(vscode)

這兩年 AI 發展迅猛&#xff0c;作為開發人員&#xff0c;我們總是追求更快、更高效的工作方式&#xff0c;AI 的出現可以說改變了很多人的編程方式。 AI 對我們來說就是一個可靠的編程助手&#xff0c;給我們提供了實時的建議和解決方&#xff0c;無論是快速修復錯誤、提升代…

Opencv計算機視覺編程攻略-第九節 描述和匹配興趣點

一般而言&#xff0c;如果一個物體在一幅圖像中被檢測到關鍵點&#xff0c;那么同一個物體在其他圖像中也會檢測到同一個關鍵點。圖像匹配是關鍵點的常用功能之一&#xff0c;它的作用包括關聯同一場景的兩幅圖像、檢測圖像中事物的發生地點等等。 1.局部模板匹配 憑單個像素就…