基于Redisson的Redis分布式锁

Redisson分布式锁_redissonclient_甩锅虾的博客-CSDN博客

 

*** 分布式锁*/
public interface DistributedLock {/*** 尝试获取锁* @param lockName* @param seconds* @return*/Boolean tryAcquire(String lockName, long seconds, TimeUnit unit);/*** 释放锁* @param lockKey*/void release(String lockKey);/*** 获取锁* @param lockKey* @return*/Boolean acquire(String lockKey, long seconds, TimeUnit unit);
}/*** 基于 redisson 封装分布式锁*/
@Component
@Slf4j
public class DistributedRedisLock implements DistributedLock {@Autowiredprivate RedissonClient redisson;private static final String LOCK_TITLE = "DistributedRedisLock:";@Overridepublic Boolean tryAcquire(String lockKey, long seconds, TimeUnit unit) {RLock lock = redisson.getLock(LOCK_TITLE + lockKey);try {boolean b = lock.tryLock(0, seconds, unit);if (b) {log.info("获取锁成功");return true;}else {log.info("获取锁失败");return false;}}catch (InterruptedException e) {log.error("try acquire distributed lock error : [{}]",e.getMessage(),e);return false;}}/*** 默认以秒为单位 尝试获取锁* @param lockKey* @param seconds* @return*/public Boolean tryAcquire(String lockKey, long seconds) {return tryAcquire(lockKey,seconds,TimeUnit.SECONDS);}@Overridepublic void release(String lockKey) {RLock lock = redisson.getLock(LOCK_TITLE + lockKey);//判断是否上锁if (lock.isLocked()) {//是否还在锁定if (lock.isHeldByCurrentThread()) {//是否是当前线程所持有的锁//释放锁lock.unlock();log.info("unlock: [{}]",lockKey);}}}@Overridepublic Boolean acquire(String lockKey,long seconds,TimeUnit unit) {String key = LOCK_TITLE + lockKey;//获取锁对象RLock lock = redisson.getLock(key);//加锁,设置过期时间lock.lock(seconds,unit);log.info("distributed lock locked : [{}]",key);return true;}/*** 默认以秒为单位获取锁,设置锁租期不触发 watchdog* @param lockKey* @param seconds* @return*/public Boolean acquire(String lockKey,long seconds) {return acquire(lockKey,seconds,TimeUnit.SECONDS);}/*** 默认获取锁 过期时间默认 30s 为获取到锁的线程阻塞 能触发 watchdog* @param lockKey* @return*/public Boolean acquire(String lockKey) {String key = LOCK_TITLE + lockKey;//获取锁对象RLock lock = redisson.getLock(key);lock.lock();log.info("distributed lock locked : [{}]",key);return true;}}// 具体的业务应用测试
public class Test {/*** redis锁*/@Autowiredprivate DistributedRedisLock redisLock;/*** lock*/public void testLock() {String key = "加锁具体的key";// 加锁redisLock.acquire(key, 10);try {// 业务逻辑} catch (NoTransactionException e) {//日志} finally {// 释放锁redisLock.release(key);}}/*** tryLock*/public void testTryLock() {String key = "加锁具体的key";//加锁Boolean isSuccess = redisLock.tryAcquire(key, 10);if (isSuccess) {//加锁成功Object result = null;try {// 业务逻辑} catch (Exception e) {// 日志} finally {redisLock.release(key);}} else {//获取锁失败处理逻辑}}
}

lock() 与 tryLock() 的区别

(1)返回值: lock() 是没有返回值的;tryLock() 的返回值是 boolean。
 

(2)时机:lock() 一直等锁释放;tryLock() 获取到锁返回true,获取不到锁并直接返回false。
 

(3)tryLock() 是可以被打断的,被中断的;lock是不可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用自动化构造随机路由模型

为什么要仿真随机路由? 路由器测试中,为了最大程度还原现网路由情况,评估路由器在现网环境下稳定工作各项指标,需要对导入路由进行离散仿真,目前路由仿真可分为导入路由与生成路由两种方式,导入路由需要现…

vue如何使用webscorket实现多人协同在线表格填写

要使用WebSocket在Vue中实现多人协同在线表格填写,你可以按照以下步骤进行操作:1. 安装WebSocket库:首先,在Vue项目中安装WebSocket库。你可以使用 socket.io-client 库来处理WebSocket通信。使用npm或yarn安装它:npm …

学习遇上的一点补救

从开始学习java到现在逐步确定好发展路线。是时候停一下步伐了。 之前不停的往前走,从学校的课程、书本开始,没有借助网课、视频,依靠自己一步一个脚印。从Java实用程序、Javaweb、JavaEE然后选择MySQL数据库、然后觉得有必要对前端了解&…

think-on-graph: 基于知识图谱的大模型推理

概述 本文的研究背景是大规模语言模型在复杂推理任务中存在困难并展示了较低的性能,特别是在需要知识的追溯能力、及时性和准确性的场景中。 过去的方法主要面临两个问题:推理不负责任容易生成虚构或带有有害文本,以及模型在预训练阶段无法…

【深入浅出C#】章节 5: 高级面向对象编程:泛型编程和集合类型

高级面向对象编程是在基础面向对象编程的基础上进一步深入和拓展的一种编程范式。它强调封装、继承和多态的概念,并引入了泛型编程和集合类型等高级特性。高级面向对象编程提供了更灵活、可扩展和可复用的代码结构,能够帮助开发者构建更复杂、更高效的应…

基于IPC-CFX的点对点通信C#

IPC-CFX有两种主要的通信方式,可以通过RabbitMQ发布和订阅,也可以通过request和response进行点对点的通信,本文主要讲的是点对点的通信方式。 在vscode里建立新的dotnet项目,可以通过终端输入dotnet new console来建立&#xff0c…

【拿来就能用】C#指定打印机打印的类

之前写过一个“C#WinForm程序中选择打印机打印”的文章,但在使用过程中,尤其是生成Word文档时,会感觉系统响应较慢。如果不需要留存打印文档的电子版,可以使用下面的类直接打印。相比之前的方法,这种方法更简单&#x…

MySQL常用语句大全

语句 DDL MySQL的DDL(数据定义语言)是一组用于创建、修改和删除数据库、表、索引、视图、存储过程和触发器等数据库对象的语句。下面是一些常用的MySQL DDL语句和它们的详细说明: alter 在MySQL中,DDL(数据定义语言…

LCD—STM32液晶显示(2.使用FSMC模拟8080时序)

目录 使用STM32的FSMC模拟8080接口时序 FSMC简介 FSMC NOR/PSRAM中的模式B时序图 用FSMC模拟8080时序 重点:HADDR内部地址与FSMC地址信号线的转换(实现地址对齐) 使用STM32的FSMC模拟8080接口时序 ILI9341的8080通讯接口时序可以由STM32使…

北邮国院物联网 Microprocessor 微处理器笔记

Introduction-随便聊 嵌入式系统是什么?专用的计算机系统。为专门功能可能对计算机架构,外设等做出一些取舍。 通常的限制:Cost(比如大量部署传感器节点),Size and weight limits(特定应用场景…

配置Hadoop_0

配置Hadoop_0 1配置Hadoop100模板虚拟机1.1配置Hadoop100模板虚拟机硬件1.2配置Hadoop100模板虚拟机软件1.3配置Hadoop100模板虚拟机IP地址1.4配置Hadoop100模板虚拟机主机名称/主机名称映射1.5配置Hadoop100模板虚拟机远程操作工具 1配置Hadoop100模板虚拟机 Hadoop100 内存…

TRT4-trt-integrate - 1 YOLOV5导出、编译、推理

模型导出 修改Image的Input动态维度 首先可以看到这个模型导出的时候Input有三个维度都是动态,而我们之前说过只需要一个batch维度是动态,所以要在export的export onnx 进行修改,将 torch.onnx.export(model, im, f, verboseFalse, opset_ver…

华为云子网路由表作用及价值

子网路由表 子网路由表作用云专线、VPN的配置与子网路由表强关联,本质是在相应的子网路由表中添加了一条路由Nat路由表问题地址变更问题snat和dnat 子网路由表作用 子网内部作为一个二层网络,通过mac地址互通,不通过路由互通。跨子网&#x…

实时网络更改检测

未经授权的配置更改可能会对业务连续性造成严重破坏,这就是为什么使用实时更改检测来检测和跟踪更改是网络管理员的一项关键任务。尽管可以手动跟踪更改,但此方法往往非常耗时,并且通常会导致人为错误,例如在跟踪时错过关键网络设…

企业需要一个数字体验平台(DXP)吗?

数字体验平台是一个软件框架,通过与不同的业务系统喝解决方案集成,帮助企业和机构建立、管理和优化跨渠道的数字体验。帮助企业实现跨网站、电子邮件、移动应用、社交平台、电子商务站点、物联网设备、数字标牌、POS系统等传播内容,除了为其中…

文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题

文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题 二、试分析在使用下列循环不变量时,HEAPSORT 的正确性:在算法的第 2~5行 for 循环每次迭代开始时,子数组 A[1…i]是一个包含了数组A[1…n]中第i小元素的最大…

IntelliJ IDEA 2023.1 更新内容总结

IntelliJ IDEA 2023.1 更新内容总结 * 主要更新内容 * UI 大改版 * 性能改进项 * 其它更新内容IntelliJ IDEA 2023.1 更新内容总结 主要更新内容 IntelliJ IDEA 2023.1 针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施, …

如果微信消息显示“已读”的话......

近日,一则 #如果微信显示已读的话# 话题冲上了微博热搜榜单。 “已读”是很多社交软件拥有的功能,如果对方接收并查看了消息,就会在消息上显示“已读”,但目前微信还没有推出这项功能。 对于“已读”功能,不少网友纷纷…

自动化用例编写思路 (使用pytest编写一个测试脚本)

目录 一,明确测试对象 二,编写测试用例 构造请求数据 封装测试代码 断言设置 三,执行脚本获取测试结果 四,总结 经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口…

Unity Hub下载中文一直验证中怎么办

Unity Hub是Unity官方提供的一款管理Unity引擎和项目的工具。然而,有时在下载中文版的Unity Hub时可能会遇到“验证中”的情况,这可能会导致下载进程无法继续。本文将介绍一些可能的解决方法,帮助您处理Unity Hub下载中文版本出现“验证中”问…