Redis 加鎖、解鎖

Redis 加鎖和解鎖的應用

上代碼

應用調用示例

            RedisLockEntity lockEntityYlb = RedisLockEntity.builder().lockKey(TradeConstants.HP_APP_AMOUNT_LOCK_PREFIX + appUser.getAccount()).value(orderId).build();boolean isLockedYlb = false;try {if (redisLock.tryLock(lockEntityYlb)) {業務邏輯}else {logger.info("給用戶分ylb加鎖失敗,賬戶正在交易中");}}catch (Exception e){logger.info("給用戶分ylb加鎖失敗,賬戶正在交易中");}finally {if (isLockedYlb) {try {redisLock.unlock(lockEntityYlb);} catch (LockException e) {logger.error(lockEntityYlb.toString());}}}

RedisLockEntity 實體類

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;@Getter
@Setter
@Builder
@ToString
public class RedisLockEntity {private String lockKey;private String value;
}

RedisLock 類

import java.util.concurrent.TimeUnit;import com.happypay.trade.exception.LockException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import lombok.extern.slf4j.Slf4j;@Service
@Slf4j
public class RedisLock {private static final Logger logger = LoggerFactory.getLogger(RedisLock.class);@Autowiredprivate RedisTemplate<String, Object> redisTemplate;private static final int TRY_COUNT = 4;public boolean tryLock(RedisLockEntity redisLockEntity) throws LockException {boolean locked = false;int tryCount = TRY_COUNT;try {while (!locked && tryCount > 0) {locked = redisTemplate.opsForValue().setIfAbsent(redisLockEntity.getLockKey(),redisLockEntity.getValue(), 2, TimeUnit.MINUTES);tryCount--;try {Thread.sleep(300);} catch (InterruptedException e) {log.error("線程被中斷" + Thread.currentThread().getId(), e);}}} catch (Exception e) {throw new LockException(e);}if (locked) {logger.info("獲取操作鎖成功:" + redisLockEntity.toString());}return locked;}public boolean unlock(RedisLockEntity redisLockEntity) throws LockException {boolean releaseLock = false;try {if (redisLockEntity == null || redisLockEntity.getLockKey() == null || redisLockEntity.getValue() == null)return false;releaseLock = false;String value = (String) redisTemplate.opsForValue().get(redisLockEntity.getLockKey());if (redisLockEntity.getValue().equals(value)) {releaseLock = redisTemplate.delete(redisLockEntity.getLockKey());}logger.info("釋放操作鎖成功:" + redisLockEntity.toString());} catch (Exception e) {logger.error("釋放鎖出錯", e);throw new LockException(e);}return releaseLock;}}

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

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

相關文章

在 Windows 上為 WSL 增加 root 賬號密碼并通過 Shell 工具連接

1. 為 WSL 設置 root 用戶密碼 在 Windows 上使用 WSL&#xff08;Windows Subsystem for Linux&#xff09;時&#xff0c;默認情況下并沒有啟用 root 賬號的密碼。為了通過 SSH 或其他工具以 root 身份連接到 WSL&#xff0c;我們需要為 root 用戶設置密碼。 設置 root 密碼步…

2730、找到最長的半重復子字符穿

題目&#xff1a; 解答&#xff1a; 窗口為[left&#xff0c;right]&#xff0c;ans為窗口長度&#xff0c;same為子串長度&#xff0c;窗口滿足題設條件&#xff0c;即只含一個連續重復字符&#xff0c;則更新ans&#xff0c;否則從左邊開始一直彈出&#xff0c;直到滿足條件…

MCP Java SDK源碼分析

MCP Java SDK源碼分析 一、引言 在當今人工智能飛速發展的時代&#xff0c;大型語言模型&#xff08;LLMs&#xff09;如GPT - 4、Claude等展現出了強大的語言理解和生成能力。然而&#xff0c;這些模型面臨著一個核心限制&#xff0c;即無法直接訪問外部世界的數據和工具。M…

[Linux]內核如何對信號進行捕捉

要理解Linux中內核如何對信號進行捕捉&#xff0c;我們需要很多前置知識的理解&#xff1a; 內核態和用戶態的區別CPU指令集權限內核態和用戶態之間的切換 由于文章的側重點不同&#xff0c;上面這些知識我會在這篇文章盡量詳細提及&#xff0c;更詳細內容還得請大家查看這篇…

設計模式-觀察者模式、命令模式

觀察者模式Observer&#xff08;觀察者&#xff09;—對象行為型模式定義&#xff1a;定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一主題對象,在它的狀態發生變化時,會通知所有的觀察者.先將 Observer A B C 注冊到 Observable &#xff0c;那么當 Observable 狀態…

【Unity筆記01】基于單例模式的簡單UI框架

單例模式的UIManagerusing System.Collections; using System.Collections.Generic; using UnityEngine;public class UIManager {private static UIManager _instance;public Dictionary<string, string> pathDict;public Dictionary<string, GameObject> prefab…

深入解析 OPC UA:工業自動化與物聯網的關鍵技術

在當今快速發展的工業自動化和物聯網&#xff08;IoT&#xff09;領域&#xff0c;數據的無縫交換和集成變得至關重要。OPC UA&#xff08;Open Platform Communications Unified Architecture&#xff09;作為一種開放的、跨平臺的工業通信協議&#xff0c;正在成為這一領域的…

MCP 協議的未來發展趨勢與學習路徑

MCP 協議的未來發展趨勢 6.1 MCP 技術演進與更新 MCP 協議正在快速發展&#xff0c;不斷引入新的功能和改進。根據 2025 年 3 月 26 日發布的協議規范&#xff0c;MCP 的最新版本已經引入了多項重要更新&#xff1a; 1.HTTP Transport 正式轉正&#xff1a;引入 Streamable …

硬件嵌入式學習路線大總結(一):C語言與linux。內功心法——從入門到精通,徹底打通你的任督二脈!

嵌入式工程師學習路線大總結&#xff08;一&#xff09; 引言&#xff1a;C語言——嵌入式領域的“屠龍寶刀”&#xff01; 兄弟們&#xff0c;如果你想在嵌入式領域闖出一片天地&#xff0c;C語言就是你手里那把最鋒利的“屠龍寶刀”&#xff01;它不像Python那樣優雅&#xf…

MCP server資源網站去哪找?國內MCP服務合集平臺有哪些?

在人工智能飛速發展的今天&#xff0c;AI模型與外部世界的交互變得愈發重要。一個好的工具不僅能提升開發效率&#xff0c;還能激發更多的創意。今天&#xff0c;我要給大家介紹一個寶藏平臺——AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;&#xff0c;一個…

修改Spatial-MLLM項目,使其專注于無人機航拍視頻的空間理解

修改Spatial-MLLM項目&#xff0c;使其專注于無人機航拍視頻的空間理解。以下是修改方案和關鍵代碼實現&#xff1a; 修改思路 輸入處理&#xff1a;將原項目的視頻文本輸入改為單一無人機航拍視頻/圖像輸入問題生成&#xff1a;自動生成空間理解相關的問題&#xff08;無需用戶…

攻防世界-Reverse-insanity

知識點 1.ELF文件逆向 2.IDApro的使用 3.strings的使用 步驟 方法一&#xff1a;IDA 使用exeinfo打開&#xff0c;發現是32位ELF文件&#xff0c;然后用ida32打開。 找到main函數&#xff0c;然后F5反編譯&#xff0c;得到flag。 tip&#xff1a;該程序是根據隨機函數生成…

【openp2p】 學習1:P2PApp和優秀的go跨平臺項目

P2PApp下面給出一個基于 RESTful 風格的 P2PApp 管理方案示例,供二次開發或 API 對接參考。核心思路就是把每個 P2PApp 當成一個可創建、查詢、修改、啟動/停止、刪除的資源來管理。 一、P2PApp 資源模型 P2PApp:id: string # 唯一標識name: string # …

邊緣設備上部署模型的限制之一——顯存占用:模型的參數量只是冰山一角

邊緣設備上部署模型的限制之一——顯存占用&#xff1a;模型的參數量只是冰山一角 在邊緣設備上部署深度學習模型已成為趨勢&#xff0c;但資源限制是其核心挑戰之一。其中&#xff0c;顯存&#xff08;或更廣義的內存&#xff09;占用是開發者們必須仔細考量的重要因素。許多…

腦機新手指南(二十一)基于 Brainstorm 的 MEG/EEG 數據分析(上篇)

一、腦機接口與神經電生理技術概述 腦機接口&#xff08;Brain-Computer Interface, BCI&#xff09;是一種在大腦與外部設備之間建立直接通信通道的技術&#xff0c;它通過采集和分析大腦信號來實現對設備的控制或信息的輸出。神經電生理信號作為腦機接口的重要數據來源&…

[Linux]內核態與用戶態詳解

內核態和用戶態是針對CPU狀態的描述。在內核態可以執行一切特權代碼&#xff0c;在用戶態只能執行那些受限級別的代碼。如果需要調用特權代碼需要進行內核態切換。 一、內核態和用戶態概況 內核態&#xff1a; 系統中既有操作系統的程序&#xff0c;也有普通用戶程序。為了安…

如何查看每個磁盤都安裝了哪些軟件或程序并卸載?

步驟如下&#xff1a; 1、點擊電腦桌面左下角&#xff1a; 2、選擇【應用和功能】 3、點擊下拉框&#xff0c;選擇想要查看的磁盤&#xff0c;下方顯示的就是所有C磁盤下安裝的軟件和程序 卸載方法&#xff1a; 點擊對應的應用&#xff0c;然后點擊卸載即可&#xff1a;

記錄一次莫名奇妙的跨域502(badgateway)錯誤

這里圖片加載不了&#xff0c;原文請訪問&#xff1a;原文鏈接 公司的項目&#xff0c;這幾天添加了一個統計功能&#xff0c; 本地測試沒太大問題&#xff0c;上線后有一個問題&#xff0c;具體現象描述如下&#xff1a; 統計首頁接口大約有5-6個&#xff0c;也就是同時需要…

Linux之線程

Linux之線程 線程之形線程接口線程安全互斥鎖條件變量&信號量生產者與消費者模型線程池 線程之形 進程是資源分配的基本單位&#xff0c;而線程是進程內部的一個執行單元&#xff0c;也是 CPU 調度的基本單位。 線程之間共享進程地址空間、文件描述符與信號處理&#xff0…

snail-job的oracle sql(oracle 11g)

官網版本的oracle sql中有自增主鍵&#xff0c;oracle 11g并不支持&#xff0c;所以改成新建索引和觸發器的方式自增主鍵。&#xff08;tip&#xff1a;snail-job的最新版本1.0.0必須使用JDK17&#xff0c; jdk8會報錯&#xff0c;所以最后沒用起來&#xff09; /*SnailJob Dat…