分布式鎖之RedissonLock

什么是Redisson?
俗話說他就是看門狗,看門狗機制是一種用于保持Redis連接活躍性的方法,通常用于分布式鎖的場景。看門狗的工作原理是:當客戶端獲取到鎖之后,會對Redis中的一個特定的鍵設置一個有限的過期時間,然后每隔一段時間(默認是15秒),客戶端會對這個鍵“續約”,即重新設置它的過期時間,以此來保持鎖的持有狀態,防止鎖因為某些原因(如客戶端崩潰或網絡問題)而被釋放。
在這里插入圖片描述
以下是核心實戰部分
配置文件讀取

@ConfigurationProperties(prefix = "spring.redis.redisson"
)
@Data
public class RedissonProperties {/*** key前綴*/private String keyPrefix;/*** 拿鎖等待時間(毫秒)*/private long waitTime = 10000;/*** 默認ttl時間(毫秒)*/private long leaseTime = 60000;@Value("${spring.redis.redisson.config.clusterServersConfig.nodeAddresses}")private String nodeAddresses;@Value("${spring.redis.redisson.config.clusterServersConfig.scanInterval}")private Integer scanInterval;@Value("${spring.redis.redisson.config.threads}")private Integer threads;@Value("${spring.redis.redisson.config.nettyThreads}")private Integer nettyThreads;@Value("${spring.redis.redisson.config.transportMode}")private String transportMode;
}

yml文件

spring:##redis集群配置redis:database: 0timeout: 5000msredisson:config:clusterServersConfig:nodeAddresses: redis://10.xxx.xx.x1:6379,redis://10.xxx.xx.x2:6379,redis://10.xxx.xx.x3:6379scanInterval: 1000nettyThreads: 0threads: 0transportMode: NIOkey-prefix: test:keylease-time: 80000wait-time: 50000

redisson自動配置類

@Configuration
@ConditionalOnClass({Redisson.class})
@EnableConfigurationProperties({RedissonProperties.class})
@Slf4j
public class RedissonAutoConfiguration {@Bean@ConditionalOnMissingBean({RedisConnectionFactory.class})public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {return new RedissonConnectionFactory(redisson);}@Bean(destroyMethod = "shutdown")@ConditionalOnMissingBean({RedissonClient.class})public RedissonClient redisson(RedissonProperties redissonProperties) throws IOException {Config config = new Config();config.useClusterServers().addNodeAddress(redissonProperties.getNodeAddresses().split(",")).setScanInterval(redissonProperties.getScanInterval());config.setThreads(redissonProperties.getThreads()).setNettyThreads(redissonProperties.getNettyThreads()).setTransportMode(TransportMode.valueOf(redissonProperties.getTransportMode()));return Redisson.create(config);}@Bean@ConditionalOnMissingBean(name = {"redisTemplate"})public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {RedisTemplate<Object, Object> template = new RedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}@Bean@ConditionalOnMissingBeanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}}

redis的緩存類實現

@Service
public class RedisCache {@Autowiredprivate RedissonClient redisson;@Autowiredprivate RedissonProperties redissonProperties;/*** 緩存** @param key 緩存key* @param <T>* @return 緩存返回值*/public <T> T get(String key) {RBucket<T> bucket = redisson.getBucket(getKey(key));return bucket.get();}/*** 以string的方式讀取緩存** @param key 緩存key* @return 緩存返回值*/public String getString(String key) {RBucket<String> bucket = redisson.getBucket(getKey(key), StringCodec.INSTANCE);return bucket.get();}/*** 以string的方式保存緩存(與其他應用共用redis時需要使用該函數)** @param key     緩存key* @param value   緩存值* @param expiredTime 緩存過期時間*/public void putString(String key, String value, long expiredTime) {RBucket<String> bucket = redisson.getBucket(getKey(key), StringCodec.INSTANCE);bucket.set(value, expiredTime, TimeUnit.MILLISECONDS);}/*** 如果不存在則寫入緩存(string方式,不帶有redisson的格式信息)** @param key     緩存key* @param value   緩存值* @param expiredTime 緩存過期時間*/public boolean putStringIfAbsent(String key, String value, long expiredTime) {RBucket<String> bucket = redisson.getBucket(getKey(key), StringCodec.INSTANCE);return bucket.trySet(value, expiredTime, TimeUnit.MILLISECONDS);}/*** 設置緩存** @param key     緩存key* @param value   緩存值* @param expiredTime 緩存過期時間* @param <T>     類型*/public <T> void put(String key, T value, long expiredTime) {RBucket<T> bucket = redisson.getBucket(getKey(key));bucket.set(value, expiredTime, TimeUnit.MILLISECONDS);}/*** 如果不存在則設置緩存** @param key     緩存key* @param value   緩存值* @param expiredTime 緩存過期時間* @param <T>     類型*/public <T> void putIfAbsent(String key, T value, long expiredTime) {RBucket<T> bucket = redisson.getBucket(getKey(key));bucket.trySet(value, expiredTime, TimeUnit.MILLISECONDS);}/*** 移除緩存** @param key*/public void remove(String key) {redisson.getBucket(getKey(key)).delete();}/*** 判斷緩存是否存在** @param key* @return*/public boolean exists(String key) {return redisson.getBucket(getKey(key)).isExists();}private String getKey(String key) {return StringUtils.format("{0}:{1}", redissonProperties.getKeyPrefix(), key);}

獲取和釋放分布式鎖接口
DistributedLock

/*** get分布式鎖* @param lockKey* @param requestId* @param expireTime* @return*/public boolean getDistributedLock(String lockKey, String requestId, long expireTime);/*** remove分布式鎖* @param lockKey* @param requestId* @return*/public boolean removeDistributedLock(String lockKey, String requestId);

實現DistributedLock的實現類邏輯

@Service
public class RedisDistributedLocker implements DistributedLocker {private static final Logger logger = LoggerFactory.getLogger(RedisDistributedLocker.class);@Autowiredprivate RedissonClient redisson;@Autowiredprivate RedissonProperties redissonProperties;public boolean getDistributedLock(String lockKey, String flagId, long expireTime) {boolean success;try {if (expireTime == 0) {expireTime = redissonProperties.getLeaseTime();}lockKey = StringUtils.format("{0}:{1}", redissonProperties.getKeyPrefix(), lockKey);RLock locker = redisson.getLock(lockKey);success = locker.tryLock(redissonProperties.getWaitTime(), expireTime, TimeUnit.MILLISECONDS);} catch (Exception e) {success = false;logger.error(StringUtils.format("獲取分布式鎖失敗,lockKey={0}, flagId={1}, expirTime={2}", lockKey, flagId, expireTime), e);}return success;}public boolean releaseDistributedLock(String lockKey, String flagId) {boolean success = false;try {lockKey = StringUtils.format("{0}:{1}", redissonProperties.getKeyPrefix(), lockKey);RLock locker = redisson.getLock(lockKey);if (locker.isHeldByCurrentThread()) {locker.unlock();success = true;}} catch (Exception e) {success = false;logger.error(StringUtils.format("分布式鎖失敗,lockKey={0}, flagId={1}", lockKey, flagId), e);}return success;}

在需要的業務場景下使用 以下為偽代碼

try {boolean ock = distributedLocker.getDistributedLock(lockKey, flagId, 9000L);if (!ock) {return;}// 實現自己的業務邏輯。。。。。。。。。。。。。。。。。。。。。。。。。} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e.getMessage());} finally {distributedLocker.releaseDistributedLock(lockKey, flagId);}

以上的是分布式鎖之RedissonLock 若需完整代碼 可識別二維碼后 給您發代碼。
在這里插入圖片描述

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

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

相關文章

[附源碼]傳世手游_玲瓏傳世_GM_安卓搭建教程

本教程僅限學習使用&#xff0c;禁止商用&#xff0c;一切后果與本人無關&#xff0c;此聲明具有法律效應&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人親自搭建成功的&#xff0c;絕對是完整可運行的&#xff0c;踩過的坑都給你們填上了。 如果你是小白也沒…

C++ 509. 斐波那契數

文章目錄 一、題目描述二、參考代碼 一、題目描述 示例 1&#xff1a; 輸入&#xff1a;n 2 輸出&#xff1a;1 解釋&#xff1a;F(2) F(1) F(0) 1 0 1 示例 2&#xff1a; 輸入&#xff1a;n 3 輸出&#xff1a;2 解釋&#xff1a;F(3) F(2) F(1) 1 1 2 示例 3…

設計模式——訪問者模式(Visitor)

訪問者模式&#xff08;Visitor Pattern&#xff09;是一種將數據操作與數據結構分離的設計模式。這種模式適用于數據結構相對穩定&#xff0c;而操作算法經常改變的情況。訪問者模式將數據結構&#xff08;穩定的部分&#xff09;中的元素&#xff08;Element&#xff09;的訪…

C語言題目:一元二次方程

題目描述 解一元二次方程ax^2bxc0的解。 輸入格式 a,b,c的值。 輸出格式 輸出兩個解&#xff0c;按照大小順序輸出&#xff0c;一個解時需要打印兩次&#xff0c;不用考慮無解問題&#xff0c;保留兩位小數 樣例輸入 1 5 -2樣例輸出 0.37 -5.37 代碼解析 首先&#xff0…

了解進程和線程

一、進程和線程 類比&#xff1a; 一個工廠&#xff0c;至少有一個車間&#xff0c;一個車間中至少有一個工人&#xff0c;最終是工人在工作。 一個程序&#xff0c;至少有一個進程&#xff0c;一個進程中至少有一個線程&#xff0c;最終是線程在工作。 進程&#xff1a;是計…

C#正則表達式,提取信息使用

正則表達式簡介 在C#中&#xff0c;正則表達式&#xff08;Regular Expression&#xff0c;通常簡寫為regex或regexp&#xff09;是一種功能強大的文本處理工具&#xff0c;它使用特定的字符序列來定義搜索模式&#xff0c;從而實現對文本的高效搜索、匹配和替換操作。正則表達…

鄉村振興與鄉村旅游深度融合:依托鄉村自然和文化資源,發展鄉村旅游產業,促進農民增收致富,打造特色美麗鄉村

目錄 一、引言 二、鄉村振興與鄉村旅游的內在聯系 三、依托鄉村自然和文化資源發展鄉村旅游產業 &#xff08;一&#xff09;挖掘鄉村自然資源優勢&#xff0c;打造特色旅游品牌 &#xff08;二&#xff09;挖掘鄉村文化資源內涵&#xff0c;豐富旅游活動內容 四、促進農…

新手做視頻號電商,做什么樣的產品好賣?適合不會選類目的新手看

大家好&#xff0c;我是電商花花&#xff0c;專注做電商的花花。 視頻號現在的發展可以說是非常好的&#xff0c;擁有著空前的市場和流量&#xff0c;隨著視頻號小店新項目對電商的沖擊&#xff0c;讓更多創業者和新手商家開始涌入視頻號電商的行列。 想要在新項目中搶占流量…

【客戶案例】禪道軟件助力長虹新網實現研發項目管理創新

四川長虹新網科技有限責任公司&#xff08;以下簡稱長虹新網&#xff09;深耕全球運營商市場二十多年&#xff0c;具備行業領先的軟硬件研發、制造、全球化市場營銷能力&#xff0c;持續服務國內外200多家主流電信及廣電運營商、垂直行業服務商&#xff0c;與合作伙伴共同成長。…

Windows11系統安裝Mysql8之后,啟動服務net start mysql報錯“服務沒有響應控制功能”的解決辦法

問題 系統環境&#xff1a;Windows11 數據庫版本&#xff1a;Mysql8 雙擊安裝&#xff0c;一路下一步&#xff0c;完成&#xff0c;很順利&#xff0c;但是開啟服務后 net start mysql 報錯&#xff1a; 服務沒有響應控制功能。 請鍵入 NET HELPMSG 2186 以獲得更多的幫助 不…

【項目001】運維工程師項目實踐:高可用性云基礎設施部署與升級項目

目錄 項目名稱 項目背景 項目目標 項目成果 我的角色與職責 我主要完成的工作內容 本次項目涉及的技術 本次項目遇到的問題與解決方法 本次項目中可能被面試官問到的問題 1、什么是ELK&#xff1f; 2、什么是Elasticsearch、Logstash 和Kibana&#xff1f; 3、ELK 三…

echarts樹圖 改文本顯示的地方的樣式

樹圖改文本顯示的時候的樣式 雖然有點越改越丑 其中有一些失敗的嘗試 forammter 無法識別html元素 所以對于tooptips有用的html元素定義獲取返回在這里寫的話是不生效的 rich配置項里面的backgroundColor官方說支持 html元素和canvas元素 已經圖片url 沒有詳細試驗 官網地址 h…

【chisel】如何用chisel寫一個上升沿檢測程序

自定義上升沿檢測 class RisingEdgeDetector extends Module {val io IO(new Bundle {val inSig Input(Bool())val outSig Output(Bool())val clock Input(Clock())})// 定義 risingedge 函數def risingedge(x: Bool): Bool x && !RegNext(x)// 使用 risingedge …

代碼簽名證書的重要作用及申請途徑

代碼簽名技術是一種確保軟件完整性和來源可信度的安全措施。它通過數字證書和加密算法為軟件代碼或可執行文件加上一個“簽名”&#xff0c;以此驗證軟件未被篡改&#xff0c;并確認其來源于可信賴的開發者。 一、代碼簽名證書的重要作用 1、提高下載率和安裝率&#xff1a;用…

Linux提權--Rsync(未授權訪問) Docker 組掛載

免責聲明:本文僅做技術學習與交流... 目錄 Rsync&#xff08;未授權訪問&#xff09; 介紹: 靶場及過程: 提權過程&#xff1a; Docker 組掛載 原理: 復現&#xff1a; 利用&#xff1a; 具體操作: 1-確定是否有docker服務 2-查看用戶是否在docker組里面 3-執行命…

包管理工具npm、cnpm、yarn、NVM

文章目錄 npmnpm基本使用npm搜索包生產環境與開發環境開發依賴與生產依賴全局安裝環境變量Path安裝包依賴安裝指定版本的包、刪除依賴配置命令別名 cnpm安裝操作命令&#xff1a;配置 yarnyarn安裝及常用命令yarn 配置淘寶鏡像 NVM使用常用命令 擴展內容npm和yarn的選擇npm發布…

USB轉串口芯片CH341、CH372、CH374、CH375等的電路及 PCB 設計的重要注意事項

前言 USB芯片的電路和PCB設計參考及注意事項&#xff0c;含CH34X、CH37X等系列芯片的電路設計說明。涉及工作穩定性和抗干擾以及USB-HOST帶電熱插拔。基于 USB 芯片的電路及 PCB 設計的重要注意事項 版本&#xff1a;2E 1、摘要 本文主要針對以下因電路及 PCB 設計不佳而引起…

文檔解析與向量化技術加速多模態大模型訓練與應用

前言 隨著人工智能技術的不斷發展&#xff0c;多模態大模型作為一種新型的機器學習技術&#xff0c;逐漸成為人工智能領域的熱點話題。多模態大模型能夠處理多種媒體數據&#xff0c;如文本、圖像、音頻和視頻等&#xff0c;并通過學習不同模態之間的關聯&#xff0c;實現更加…

Q1咖啡機行業線上市場(京東天貓淘寶)銷售數據分析

回顧疫情那幾年&#xff0c;咖啡機市場可能是大環境帶動下爆發飛速的品類之一。在整體廚房小家電大盤銷售不佳的情況下&#xff0c; 咖啡機市場的表現是亮眼的。而今年Q1季度&#xff0c;在廚衛小電市場整體低迷的狀態下&#xff0c;咖啡機市場依然保持著穩中向好的趨勢。 根據…

Windows 命令修改時間

Windows 命令修改時間 運行w32tm /resync&#xff0c; 顯示“此計算機沒有重新同步&#xff0c;因為沒有可用的時間數據”&#xff0c; 運行w32tm /query /source &#xff0c; 顯示“Local CMOS Clock”&#xff0c;表示正在使用的是主板上的時間&#xff0c;沒有使用外部…