java通過redis簡單實現分布式鎖

目錄

一、簡介

二、代碼實現

1、maven添加依賴

2、核心邏輯代碼

3、使用方式

三、總結


一、簡介

我們知道在Java中可以通過關鍵字synchronized來防止并發引起的問題,而分布式中就需要考慮分布式鎖了,今天來講一個比較簡單的實現,通過redis實現分布式鎖,為什么要用redis呢?因為redis很快,還有很多優點,具體可以查看我歷史寫的文章---------------深入了解Redis:性能、應用場景與常見問題解決方案_redis應用場景及出現的問題-CSDN博客

二、代碼實現

1、maven添加依賴

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2、核心邏輯代碼


/*** 通過redis簡單實現分布式鎖* @author zengLingYao* @date 2025/8/27 21:16*/
@Component
public class ZengLingYaoService {@Resourcepublic RedisTemplate redisTemplate;/*** 獲取鎖* 成果獲取鎖,返回true* 失敗返回false* @param key 鎖標識用于區分不同鎖* @param timeout 有效時間* @param timeUnit 時間單位*/public Boolean tryLock(String key, long timeout, TimeUnit timeUnit){return redisTemplate.opsForValue().setIfAbsent(key, "1", timeout, timeUnit);}/*** 解鎖* @param key 鎖標識用于區分不同鎖*/public void unlock(String key) {redisTemplate.delete(key);}}

3、使用方式

    /*** 演示使用分布式鎖*/public void zengLingYao(String id) {boolean getLock = zengLingYaoService.tryLock(id, 180, TimeUnit.SECONDS);if (!getLock) {throw new RuntimeException("別人也在操作,你等會再試");}try {// 執行業務邏輯}finally {zengLingYaoService.unlock(id);}}

三、總結

1、setIfAbsent是原子性操作所以不會并發

2、key用來區分不同業務

3、設計過期時間,避免了死鎖情況

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

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

相關文章

網絡編程--TCP/UDP Socket套接字

網絡編程 程序員主要操作應用層和傳輸層來實現網絡編程&#xff0c;也就是自己寫一個程序&#xff0c;讓這個程序可以使用網絡來通信&#xff0c;這個程序屬于應用層&#xff0c;實現通訊就需要獲取到傳輸層提供的服務 這就需要使用傳輸層提供的api UDP: 無連接&#xff0c;不可…

claude-code訂閱方案

Claude Code 訂閱方案對比 編寫日期&#xff1a;2025 年 08 月 20 日 &#x1f3f7;? 專業版 Pro ($20/月&#xff0c;$200/年) 主要特性 可用模型&#xff1a;Claude Sonnet 4&#xff08;Claude Opus 4成本太高&#xff0c;謹慎選擇&#xff09;適用場景&#xff1a;適合輕度…

146. LRU緩存

題目&#xff1a; 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類&#xff1a; LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存 int get(int key) 如果關鍵字 key 存在于緩存中&#xff0c;則返回關鍵字的值&#x…

第二十節:3D文本渲染 - 字體幾何體生成與特效

第二十節&#xff1a;3D文本渲染 - 字體幾何體生成與特效 TextGeometry深度解析與高級文字效果實現1. 核心概念解析 1.1 3D文字渲染技術對比技術原理優點缺點TextGeometry將字體輪廓轉換為3D網格真實3D效果&#xff0c;支持材質性能開銷大&#xff0c;內存占用高Canvas紋理將文…

zzz‘sJava知識點概括總結

類型轉化 字符串&#xff1a;c語言&#xff1a;char Java&#xff1a;string 表達式值的類型由最高類型決定&#xff1a; 取值范圍&#xff1a;byte<short<int<long<float<double&#xff08;且運算時byte和short都是轉化為int類型進行計算防止數據溢出&…

SONiC 之 Testbed(2)Ansible

Ansible 是一款由 Red Hat 主導開發的 開源自動化工具&#xff0c;專注于 配置管理、應用部署、任務編排和IT自動化。它基于 無代理&#xff08;Agentless&#xff09;架構&#xff0c;通過 SSH&#xff08;默認&#xff09;或 WinRM 協議與目標設備通信&#xff0c;無需在被控…

瑞芯微RK3568與君正X2600e平臺Linux系統CS創世SD NAND應用全解析與驅動架構詳解

前言 今天就瑞芯微平臺和北京君正平臺下的linux系統中關于CS創世 SD NAND的使用做一些經驗的分享&#xff0c;如有不正&#xff0c;請批評指正&#xff1b; 采用的開發板是RK3568和x2600e&#xff0c;ubuntu版本是20.04&#xff0c;交叉編譯工具鏈是aarch64-linux-gnu-和mips…

深入解析 Flink Function

RichFunctionFunction只是個標記接口public interface Function extends java.io.Serializable {}RichFunction 的核心語義是為用戶定義的函數&#xff08;UDF&#xff09;提供生命周期管理和運行時上下文訪問的能力。任何一個普通的 Flink Function 接口&#xff08;例如 MapF…

JMeter —— 壓力測試

目錄 常用的性能指標 一、吞吐量類指標 二、響應時間類指標 三、資源利用率指標 JMeter 一、JMeter 簡介 二.下載安裝JMeter&#xff1a; 三.如何使用JMeter&#xff1a; 壓力測試考察當前軟硬件環境下系統所能承受的最大負荷并幫助找出系統瓶頸所在。壓測都是為了系統…

Transformer在哪?做了權重共享?

1、什么是權值共享權重共享是指在模型的不同層之間復?相同的參數。這可以減少模型的總體參數數量&#xff0c;并使得模型在訓練時更容易學習。2、在Transformer中的應用常見的做法是共享詞嵌入層&#xff08;embedding layer&#xff09;和輸出層&#xff08;output layer&…

將 agents 連接到 Elasticsearch 使用模型上下文協議 - docker

我們在之前的文章 “將 agents 連接到 Elasticsearch 使用模型上下文協議” 及 “使用 MCP 將代理連接到 Elasticsearch 并對索引進行查詢” 詳述了如何使用 Elasticsearch MCP server 來和我們的 Elasticsearch 進行對話。細心的開發者可能已經注意到我們的 Elasticsearch MCP…

Shell 編程基礎與實踐要點梳理

目錄 前言 一、認識 Shell 1.1 Shell 的定義與作用 1.2 Shell 解釋器 二、Shell 腳本入門 2.1 編寫 Shell 腳本 2.2 賦予執行權限與執行腳本 三、Shell 變量 3.1 變量定義與規則 3.2 變量使用與操作 3.3 變量類型 四、Shell 字符串 4.1 字符串定義方式 4.2 字符串…

Python自動化測試完整教程:pytest + selenium實戰

目錄 前言環境搭建pytest基礎教程selenium基礎教程pytest selenium實戰項目頁面對象模式(POM)測試報告生成持續集成配置最佳實踐和進階技巧總結 前言 自動化測試是現代軟件開發中不可或缺的一環。Python作為一門簡潔優雅的編程語言&#xff0c;配合pytest測試框架和seleniu…

APM 系列(一):Skywalking 與 Easyearch 集成

概述 SkyWalking 是一個開源的可觀測性平臺&#xff0c;用于收集、分析、聚合和可視化服務和云原生基礎設施的數據。SkyWalking 提供了一種簡單的方法&#xff0c;即使在云之間也能保持對分布式系統的清晰視圖。它是一個現代的 APM&#xff0c;專門為云原生、基于容器的分布式…

使用 AD 帳戶從 ASP.NET 8 容器登錄 SQL Server 的 Kerberos Sidecar

我最近在做一個項目,需要將一個 ASP.NET 8 Web API 應用程序容器化,該應用程序需要與本地運行的 SQL Server 數據庫進行通信。我們決定將 ASP.NET 8 容器定位到 Linux 系統,因此必須與運行在 Windows AD 域中的數據庫進行通信。 問題 我們之前的設置是使用 IIS 在 Windows …

More Effective C++ 條款11:禁止異常流出析構函數之外

More Effective C 條款11&#xff1a;禁止異常流出析構函數之外核心思想 在C中&#xff0c;析構函數絕對不允許拋出異常。如果異常從析構函數中傳播出去&#xff0c;可能會導致程序立即終止或未定義行為&#xff0c;特別是在棧展開過程中處理已有異常時。通過捕獲并處理所有析構…

商超高峰客流統計誤差↓75%!陌訊多模態融合算法在智慧零售的實戰解析

原創聲明&#xff1a;本文為原創技術解析&#xff0c;核心技術參數、架構設計及實戰數據引用自 “陌訊技術白皮書”&#xff0c;技術方案與落地案例結合aishop.mosisson.com智慧零售數據聯動場景展開&#xff0c;禁止未經授權的轉載與商用。 一、行業痛點&#xff1a;智慧零售…

PyTorch實戰(2)——使用PyTorch構建神經網絡

PyTorch實戰&#xff08;2&#xff09;——使用PyTorch構建神經網絡0. 前言1. PyTorch 構建神經網絡初體驗1.1 使用 PyTorch 構建神經網絡1.2 神經網絡數據加載1.3 模型測試1.4 獲取中間層的值2. 使用 Sequential 類構建神經網絡3. PyTorch 模型的保存和加載3.1 模型保存所需組…

關于git的安裝(windows)

1.git的介紹 Git 是一個分布式版本控制系統&#xff0c;由 Linus Torvalds 在 2005 年為 Linux 內核開發而創建。它能夠高效地處理從小型到超大型項目的版本管理&#xff0c;具有以下特點&#xff1a; 分布式架構&#xff1a;每個開發者本地都有完整的倉庫副本高效性能&#…

Java后端開發?接口封裝器!

開發接口確實是Java后端開發中最核心、最可見的產出工作。“對入參校驗、處理業務邏輯、返回格式處理”——精準地描述了一個API接口的核心處理流程。 但這只是冰山之上最直觀的部分。一個專業、穩健、可擴展的后端系統&#xff0c;其復雜性和價值絕大部分隱藏在冰山之下。結合…