Redis分布式锁的try-with-resources实现

Redis分布式锁的try-with-resources实现

在Java中,try-with-resources是一种自动资源管理机制,适用于实现了AutoCloseable接口的类。通过结合Redis分布式锁和try-with-resources,可以确保锁的自动释放,避免因异常或忘记释放锁导致的问题。

实现Redis分布式锁

Redis分布式锁通常使用SET命令的NX(不存在时设置)和PX(过期时间)选项来实现。以下是一个简单的Redis分布式锁实现:

public class RedisDistributedLock implements AutoCloseable {private final Jedis jedis;private final String lockKey;private final String lockValue;private final long expireTime;public RedisDistributedLock(Jedis jedis, String lockKey, long expireTime) {this.jedis = jedis;this.lockKey = lockKey;this.lockValue = UUID.randomUUID().toString();this.expireTime = expireTime;}public boolean tryLock() {String result = jedis.set(lockKey, lockValue, "NX", "PX", expireTime);return "OK".equals(result);}public void unlock() {if (lockValue.equals(jedis.get(lockKey))) {jedis.del(lockKey);}}@Overridepublic void close() {unlock();}
}

使用try-with-resources

通过实现AutoCloseable接口,可以在try-with-resources块中使用RedisDistributedLock,确保锁在代码块执行完毕后自动释放:

try (RedisDistributedLock lock = new RedisDistributedLock(jedis, "myLock", 10000)) {if (lock.tryLock()) {// 执行业务逻辑} else {// 获取锁失败}
} // 锁会自动释放

注意事项

  • 锁的释放:确保锁的值是唯一的,避免误删其他客户端持有的锁。在unlock方法中,通过比较锁的值来确保只有锁的持有者才能释放锁。
  • 过期时间:设置合理的过期时间,避免因业务逻辑执行时间过长导致锁过期。
  • 异常处理:在try-with-resources块中,如果发生异常,锁会自动释放,但需要根据业务需求处理异常。

完整示例

以下是一个完整的示例,展示了如何实现和使用Redis分布式锁:

public class RedisLockExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);String lockKey = "myLock";long expireTime = 10000; // 10秒try (RedisDistributedLock lock = new RedisDistributedLock(jedis, lockKey, expireTime)) {if (lock.tryLock()) {System.out.println("Lock acquired, executing business logic...");Thread.sleep(3000); // 模拟业务逻辑执行} else {System.out.println("Failed to acquire lock");}} catch (Exception e) {e.printStackTrace();} finally {jedis.close();}}
}

总结

通过实现AutoCloseable接口,Redis分布式锁可以与try-with-resources机制结合,确保锁的自动释放,提高代码的健壮性和可维护性。这种方法简化了锁的管理,减少了因忘记释放锁而导致的问题。

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

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

相关文章

上传文件接口设计,SpringBoot + MinIO/S3 文件服务实现:FileService 接口与 FileServiceImpl 详解

在企业项目中,文件上传和管理是非常常见的需求。本文基于 芋道源码 的实现,介绍如何封装一个通用的 文件服务 FileService,支持:文件上传(保存数据库记录 存储文件到 S3/MinIO 等对象存储)文件下载与删除文…

MVC 依赖注入(DI)与服务全解析(附避坑实战)

依赖注入的核心概念 依赖注入(DI)是一种设计模式,通过将对象的依赖关系从内部创建转移到外部传递,实现解耦。在 MVC 框架中,DI 容器负责管理对象的生命周期和依赖关系,开发者只需声明依赖,容器…

【实证分析】上市公司经营风险数据集-含代码(2000-2022年)

数据简介:上市公司经营风险涉及多维度、多层次的复杂因素,本文章参考王竹泉-经营风险与营运资金融资决策对上市公司经验风险进行测算,经营风险是该公司息税折旧摊销前利润率的标准差,经营风险是该公司息税折旧摊销前利润率的标准差…

领码方案|Windows 下 PLT → PDF 转换服务超级完整版:异步、权限、进度

摘要 面向 Windows 平台,使用 ASP.NET Core Web API 结合 Ghostscript.NET 库,实现 PLT(HPGL)→PDF 的纯库调用转换,无需外部进程。支持同步与异步模式,采用 JWTRBAC 进行权限治理,任务状态存储…

浏览器兼容性问题全解:CSS 前缀、Grid/Flex 布局兼容方案与跨浏览器调试技巧

1. 浏览器兼容性与前缀问题 不同浏览器(尤其是老版本 IE、Edge、Safari)对新特性(比如 CSS 变量、Grid、Flex 等)的支持程度不一,需要使用厂商前缀(-webkit-、-moz- 等)或降级方案。新手往往忽…

【Android View】事件分发机制

参考文献 https://juejin.cn/post/6844904041487532045https://juejin.cn/post/6844903894103883789#heading-12https://www.jianshu.com/p/dea72779a6b7 文章目录

【大数据相关】ClickHouse命令行与SQL语法详解

ClickHouse命令行与SQL语法详解一、ClickHouse命令行与SQL语法详解第一部分:ClickHouse SQL 命令行客户端 (clickhouse-client)1. 基础连接2. 核心命令行参数3. 数据导入与导出实战第二部分:ClickHouse SQL 语法详解1. DDL (数据定义语言)2. DML (数据操…

学习日记-CSS-day53-9.11

1.CSS介绍知识点核心内容重点CSS定义层叠样式表,用于内容修饰和样式展现英文全称cascading style sheetsCSS作用实现HTML内容与样式分离,提高开发效率对比传统HTML元素单独设置样式的低效方式学习建议掌握常用功能即可,重点在打通前后端数据通…

Maven中optional的作用

目的: 控制依赖传递 :将依赖标记为可选,这样当其他模块依赖common-component时,不会自动继承Elasticsearch依赖。这遵循了"依赖最小化"原则,避免不必要的库被引入到不需要它们的模块中。模块化设计 &#xf…

蓝桥杯算法之基础知识(7)---排序题的快排和归并排序

一、快排》快排方法,就三步1.随便选一个值作为基准值x2.拿选中的这个x值划分队列为左右两个区间(左边的都小于x,右边的都大于x)3.然后递归左区间和右区间就行》代码举例:#qs排序#1 6 7 8 6 5 4 #先找比较点&#xff0c…

缓存未命中

缓存未命中(Cache Miss) 发生在 CPU 访问某块内存时,该地址不在当前缓存(L1/L2/L3)中,导致程序被迫从更慢的内存(RAM)读取数据,严重拖慢程序执行速度。 📍 一…

AR眼镜:化工安全生产的技术革命

在石化企业的压缩机组巡检中,佩戴AR眼镜的巡检员眼前实时显示着设备温度场分布和振动频谱曲线,单台设备巡检时间从45分钟缩短至18分钟。这不仅是效率的提升,更是化工安全生产的一场智能革命。一、行业痛点:传统化工巡检的困境与挑…

消息中间件RabbitMQ(从入门到精通)

RabbitMQ概念_MQ 消息队列 MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话,你一言我一语。必须及时回复 异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系。…

前端学习之后端java小白(五)之多表查询/事务

一、多表查询概念二、概述 1. 内连接隐式内连接 SELECT 字段列表 FROM 表1,表2... WHERE 条件显示内连接SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件2. 外连接 左外连接SELECT 列名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 连接条件;右外连接SELECT 列名…

Java全栈学习笔记34

# JDBCjava database connection Java 数据库连接技术## JDBC 驱动程序如果需要通过jdbc技术连接关系型数据库,就需要为jdbc提供一个该数据库的驱动。驱动程序由对应的数据库厂商提供。mysql提供了针对于各种语言的驱动程序。去官网下载和java相关的驱动即可## JDB…

如何为MySQL中的JSON字段设置索引

背景 MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定义字段等。 虽然MySQL提供了读写JSON数据的函数&am…

【学习日记】

1.上午看了会面经,八股,很多看不懂1.5排查本地mysql服务启动问题2.刷了两道题翻转二叉树的Dfs和bfs递归方法,看了几分钟看懂了,一开始刷题,没有这种感觉,可能思维上升了3.下午做了会ppt4.看了ssm的一个gith…

本地大模型部署指南-Ollama与HuggingFace对比

在本地部署大模型时,用 Ollama 和 Hugging Face (HF) 确实有很大区别,涉及系统、硬件、训练、推理方式,以及能否查看模型源代码。下面我分几个维度说明: 系统和安装 Ollama 定位是「开箱即用」的本地大模型运行环境。 自带运行时&…

河北周边有哪些比较靠谱的智算中心?

河北省通过算力普惠、绿色能源、数据开放、金融支持四大支柱政策,推动智算中心高质量发展。河北及周边地区的智算中心已形成高可靠性、先进技术和战略协同的布局。那么,河北周边有哪些比较靠谱的智算中心?一、河北周边智算中心盘点‍1、尚航怀…

电动汽车充电标准之 — 国标 GB/T 18487《电动汽车传导充电系统》 简介

GB/T 18487 的全称是 《电动汽车传导充电系统》 ,它是中国电动汽车充电领域最基础、最核心的国家标准之一。该标准规定了电动汽车传导充电系统的通用要求、通信协议、安全要求等,是整个中国充电基础设施建设的基石。 与您之前了解的IEC 61851类似&#x…