使用Redission實現分布式鎖

分布式鎖在分布式系統中非常重要,主要用于解決多個進程/服務并發訪問共享資源時的數據一致性問題。在日常開發中常用于:

1. 防止重復操作(冪等性控制)

  • 場景:用戶重復提交訂單、重復支付、重復點擊等。

  • 示例
    用戶快速點擊“提交訂單”按鈕時,用?訂單ID + 用戶ID?作為鎖的Key,確保同一訂單不會被重復處理。

2. 秒殺/搶購(庫存扣減)

  • 場景:高并發下扣減庫存,防止超賣。

3. 定時任務調度(避免多實例重復執行)

  • 場景:集群環境下,確保定時任務(如每天報表生成)只由一個節點執行。

4. 分布式系統并發控制

  • 場景:多個服務實例同時操作共享資源(如文件、配置、數據庫行)。

  • 示例
    多個節點同時修改同一份配置文件時,通過分布式鎖確保串行化修改。

5. 緩存擊穿保護

  • 場景:高并發下緩存失效時,防止大量請求直接穿透到數據庫。

6. 全局唯一流水號生成

  • 場景:分布式系統中生成唯一訂單號、交易號等。

  • 示例
    通過鎖保護Redis/LDB的自增序列,避免號段重復。

7. 分布式事務協調

  • 場景:在Saga、TCC等分布式事務模式中,作為協調資源競爭的手段。

Redission的使用

1.引入依賴:

<!--使用redisson作為所有分布式鎖,分布式對象等功能框架-->
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version>
</dependency>

2.完成配置,與Redis服務器建立連接:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.io.IOException;/*** @author* @Desc:redisson配置* @create: 2024-06-08 17:54**/
@Configuration
public class MyRedissonConfig {@Bean(destroyMethod = "shutdown")public RedissonClient redisson()throws IOException{Config config=new Config();config.useSingleServer().setAddress("redis://192.168.56.10:6379");return Redisson.create(config);}
}

上面代碼中@Bean(destroyMethod="shutdown"),destroyMethod="shutdown" 起到作用為:當Spring容器關閉時,會自動調用RedissonClient實例的shutdown()方法來優雅地關閉Redisson客戶端連接,關閉與Redis服務器的連接,釋放所有相關資源,避免資源泄漏。

3.使用,在需要使用Redission的地方,使用注解完成資源注入:

    @Autowiredprivate RedissonClient redissonClient;

具體使用示例:

    @Autowiredprivate RedissonClient redissonClient;public static final String UPLOAD_LOCK = "seckill:upload:lock";// 每隔5秒執行一次@Scheduled(cron = "*/5 * * * *  ?")public void uploadSeckillSkuLatest3Days() {log.info("上架最近三天的秒殺商品");// 加上分布式鎖,避免多個定時任務同時執行RLock lock = redissonClient.getLock(UPLOAD_LOCK);// 最多等待10秒,上鎖成功,則執行秒殺商品上架邏輯lock.lock(10, TimeUnit.SECONDS);try {seckillSkuService.uploadSeckillSkuLatest3Days();} finally {lock.unlock();}}

上面代碼中有2處需特別注意:

1.上鎖時間,等待時間,需結合業務代碼執行時間進行設置,比業務代碼執行時間多出1~2秒;

2. 在finally代碼塊中釋放鎖,無論執行成功與否或有異常產生,都要釋放鎖,防止出現死鎖。

拓展

1.技術選型建議

  1. Redis(Redisson):性能高,適合大多數場景(推薦)。

  2. Zookeeper:強一致性,適合對可靠性要求極高的場景。

  3. 數據庫樂觀鎖/悲觀鎖:簡單但性能較差,適合低頻競爭場景。


2.注意事項

  • 鎖的粒度:盡量細粒度(例如按訂單ID鎖,而非全局鎖)。

  • 超時時間:避免死鎖,設置合理的超時(Redisson默認30秒)。

  • 可重入性:確保鎖支持同一線程重入(Redisson的RLock支持)。

  • 容錯性:考慮Redis集群故障時的降級方案(如本地鎖+告警)。

分布式鎖是分布式系統的核心基礎組件,合理使用能有效解決并發沖突問題。

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

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

相關文章

VScode 畫時序圖(FPGA)

1、先安裝插件&#xff1a; 2、然后就可以編寫一個.js文件&#xff0c;如下&#xff1a; {signal: [{name: clk, wave: p.......|..},{name: rstn, wave: 01......|..},{name: din_vld, wave: 0.1.0...|..},{name: din, wave: "x.x...|..", data: ["D0", …

嵌入式學習筆記——I2C

IIC協議詳解 一、IIC協議簡介二、IIC總線結構圖三、IIC通信流程詳解1. 空閑狀態 : 雙高空閑2. 起始信號&#xff08;START&#xff09;: 時高數下開始3. 停止信號&#xff08;STOP&#xff09;: 時高數上結束4. 數據傳輸格式 : 時高數穩&#xff0c;時低數變5. 應答信號 四、寫…

Apifox Helper 與 Swagger3 區別

核心定位差異 Apifox Helper 定位&#xff1a;基于 IDEA 的代碼注釋解析工具&#xff0c;與 Apifox 平臺深度集成&#xff0c;實現文檔自動生成接口管理測試協作的一體化流程。 特點&#xff1a; 通過解析 Javadoc、KDoc 等注釋生成文檔&#xff0c;代碼零侵入&#xff08;無…

單片機實現多線程的方法匯總

在單片機上實現“多線程”的方法有幾種&#xff0c;下面按照從簡單到復雜、從輕量到系統性來列出常見的方案&#xff1a; &#x1f9f5; 一、偽多線程&#xff08;最輕量&#xff09; 方法&#xff1a;主循環 狀態機 / 定時器輪詢 主循環中輪流調用各個任務的處理函數&#x…

網絡:華為數通HCIA學習:靜態路由基礎

文章目錄 前言靜態路由基礎靜態路由應用場景 靜態路由配置靜態路由在串行網絡的配置靜態路由在以太網中的配置 負載分擔配置驗證 路由備份&#xff08;浮動靜態路由&#xff09;配置驗證 缺省路由配置驗證 總結 華為HCIA 基礎實驗&#xff0d;靜態路由 & eNSP靜態路由 基礎…

[項目總結] 在線OJ刷題系統項目技術應用(下)

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄: &#x1f9ca; Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection與…

Qt音頻輸出:QAudioOutput詳解與示例

1. 簡介 QAudioOutput是Qt多媒體框架中的一個關鍵類&#xff0c;它提供了將PCM&#xff08;脈沖編碼調制&#xff09;原始音頻數據發送到音頻輸出設備的接口。作為Qt多媒體組件的一部分&#xff0c;QAudioOutput允許開發者在應用程序中實現音頻播放功能&#xff0c;支持多種音…

【計算機網絡】Linux配置SNAT/DNAT策略

什么是NAT&#xff1f; NAT 全稱是 Network Address Translation&#xff08;網絡地址轉換&#xff09;&#xff0c;是一個用來在多個設備共享一個公網 IP上網的技術。 NAT 的核心作用&#xff1a;將一個網絡中的私有 IP 地址&#xff0c;轉換為公網 IP 地址&#xff0c;從而…

Redis淘汰策略詳解!

目錄 一、為什么需要淘汰策略&#xff1f; &#x1f914;二、Redis 的淘汰策略詳解 &#x1f447;三、如何選擇合適的淘汰策略&#xff1f; &#x1f914;???四、如何切換 Redis 的淘汰策略&#xff1f; ??&#x1f527;五、總結 &#x1f389; &#x1f31f;我的其他文章…

存儲基石:深度解讀Linux磁盤管理機制與文件系統實戰

Linux系列 文章目錄 Linux系列前言一、磁盤1.1 初識磁盤1.2 磁盤的物理結構1.3 磁盤的存儲結構1.4 磁盤的邏輯結構 二、文件系統2.1 系統對磁盤的管理2.2 文件在磁盤中的操作 前言 Linux 文件系統是操作系統中用于管理和組織存儲設備&#xff08;如硬盤、SSD、USB 等&#xff…

本節課課堂總結

匿名子類&#xff1a; 說明 和 Java 一樣&#xff0c;可以通過包含帶有定義或重寫的代碼塊的方式創建一個匿名的子類。 單例對象&#xff08;伴生對象&#xff09; Scala語言是完全面向對象的語言&#xff0c;所以并沒有靜態的操作&#xff08;即在Scala中沒有靜態的概念&a…

I2C、SPI、UART、CAN 通信協議詳解

一、協議基本特性對比 特性ICSPIUARTCAN通信類型同步、半雙工同步、全雙工異步、全雙工異步、多主多從信號線SDA&#xff08;數據&#xff09;、SCL&#xff08;時鐘&#xff09;MOSI、MISO、SCK、SS&#xff08;片選&#xff09;TX&#xff08;發送&#xff09;、RX&#xff…

【diffusers 進階(十五)】dataset 工具,Parquet和Arrow 數據文件格式,load dataset 方法

系列文章目錄 【diffusers 極速入門&#xff08;一&#xff09;】pipeline 實際調用的是什么&#xff1f; call 方法!【diffusers 極速入門&#xff08;二&#xff09;】如何得到擴散去噪的中間結果&#xff1f;Pipeline callbacks 管道回調函數【diffusers極速入門&#xff0…

第十三章:持久化存儲_《鳳凰架構:構建可靠的大型分布式系統》

第十三章 持久化存儲 一、Kubernetes存儲設計核心概念 &#xff08;1&#xff09;存儲抽象模型 PersistentVolume (PV)&#xff1a;集群級別的存儲資源抽象&#xff08;如NFS卷/云存儲盤&#xff09;PersistentVolumeClaim (PVC)&#xff1a;用戶對存儲資源的聲明請求&#…

以太網安全

前言&#xff1a; 端口隔離可實現同一VLAN內端口之間的隔離。用戶只需要將端口加入到隔離組中&#xff0c;就可以實現隔離組內端口之間的二層數據的隔離端口安全是一種在交換機接入層實施的安全機制&#xff0c;旨在通過控制端口的MAC地址學習行為&#xff0c;確保僅授權設備能…

跨域問題前端解決

由于瀏覽器的同源策略&#xff0c;前后端分離的項目&#xff0c;調試的時候總是會遇到跨域的問題&#xff0c;這里通過修改前端代碼解決跨域問題。 首先先查看前端代碼的根目錄下&#xff0c;有沒有vue.config.js文件, 若有&#xff0c;使用方法1&#xff0c;若沒有此文件&…

Elasticsearch 報錯index_closed_exception

index_closed_exception 是 Elasticsearch 中的一個異常類型&#xff0c;它通常發生在嘗試對一個已經被關閉&#xff08;closed&#xff09;的索引執行搜索、寫入或其他操作時。在 Elasticsearch 中&#xff0c;索引是用來存儲和檢索數據的邏輯命名空間&#xff0c;可以將其類比…

LearnOpenGL-筆記-其九

今天讓我們完結高級OpenGL的部分&#xff1a; Instancing 很多時候&#xff0c;在場景中包含有大量實例的時候&#xff0c;光是調用GPU的繪制函數這個過程都會帶來非常大的開銷&#xff0c;因此我們需要想辦法在每一次調用GPU的繪制函數時盡可能多地繪制&#xff0c;這個過程就…

PDF預覽-搜索并高亮文本

在PDF.js中實現搜索高亮功能可以通過自定義一些代碼來實現。PDF.js 是一個通用的、基于Web的PDF閱讀器&#xff0c;它允許你在網頁上嵌入PDF文件&#xff0c;并提供基本的閱讀功能。要實現搜索并高亮顯示文本&#xff0c;你可以通過以下幾個步驟來完成&#xff1a; 1. 引入PDF…

二叉樹——隊列bfs專題

1.N叉樹的層序遍歷 我們之前遇到過二叉樹的層序遍歷&#xff0c;只需要用隊列先進先出的特性就可以達到層序遍歷的目的。 而這里不是二叉樹&#xff0c;也就是說讓節點的孩子入隊列時不僅僅是左右孩子了&#xff0c;而是它的所有孩子。而我們看這棵多叉樹的構造&#xff0c;它…