使用redis的setnx实现分布式锁

在Redis中,SETNX 是 “Set If Not Exists”(如果不存在,则设置)的缩写。这是一个原子操作,用于设置一个键的值,前提是这个键不存在。如果键已经存在,.则不会执行任何操作。

封装方法trylock,用于获取分布式锁

/*** 尝试获  取一个锁。** @param name   锁的名称,通常是一个资源的标识。* @param expire 锁的过期时间,单位为毫秒。* @return 如果获取锁成功,返回一个唯一的token;如果失败,则返回null。*/public String tryLock(String name, long expire) {// 为锁名称添加后缀,以避免命名冲突name = name + "_lock";// 生成一个唯一的token,用于标识持有锁的客户端String token = UUID.randomUUID().toString();// 获取Redis连接工厂RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();// 获取Redis连接RedisConnection conn = factory.getConnection();try {// 使用SET命令尝试以NX选项(只在键不存在时设置)设置键值对,如果成功,返回true// 这里使用了Expiration指定键的过期时间,以确保锁在一段时间后自动释放// 参考redis命令:SET key value [EX seconds] [PX milliseconds] [NX|XX]Boolean result = conn.set(name.getBytes(), //keytoken.getBytes(), //valueExpiration.from(expire, TimeUnit.MILLISECONDS),RedisStringCommands.SetOption.SET_IF_ABSENT // NX);// 如果设置成功,返回生成的tokenif (result != null && result)return token;} finally {// 释放Redis连接RedisConnectionUtils.releaseConnection(conn, factory, false);}// 如果未能成功获取锁,返回nullreturn null;}

接下来,你可以在需要防止并发执行的方法中使用tryLock方法:

	public void exampleMethod(String taskName) {String lockKey = "myLockKey";// 尝试获取锁String token = tryLock(lockKey, 10000); // 锁过期时间为10秒if (token != null) {try {// 获取锁成功,执行业务逻辑System.out.println("所获取成功");// 模拟任务执行// ...} finally {// 释放锁stringRedisTemplate.delete(lockKey+ "_lock");}} else {// 获取锁失败,处理失败逻辑System.out.println("获取锁失败");}}

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

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

相关文章

智能超越了科技,更是一个复杂系统

智能不仅仅是科技系统,更是一个复杂系统。智能是一个多学科领域,涉及计算机科学、人工智能、神经科学、心理学、社会学、人文艺术、宗教哲学等多个学科。科技系统只是智能的一部分,虽然它们在处理信息和执行任务方面非常强大,但它…

CCF-CSP认证 2023年3月01 田地丈量

矩形重叠面积公式&#xff1a; p1与p2表示矩形A的左下角和右上角&#xff0c;用p3和p4表示矩形B的左下角和右上角。 res!(p1.x > p4.x) || (p2.x < p3.x) || (p1.y > p4.y) || (p2.y < p3.y) //对矩阵不重叠求反 矩阵重叠面积 double Len Math.min(p2_x, p4_x…

深入解析Solon路由的Url大小写匹配策略与实际应用

在数字化时代的背景下&#xff0c;企业对于采购管理的需求日益增长。为了满足这一需求&#xff0c;我们通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;构建了一个从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理平台。 Solon路由器对ur…

小米员工自爆:35岁被裁后,投百份简历无人问津,一气之下把薪资由2W调为3W,简历改成英文,结果出乎意料

“35岁”&#xff0c;就像职场里一道无形的门槛&#xff0c;压得人喘不过气。一旦迈过这道坎&#xff0c;焦虑、迷茫、恐慌&#xff0c;接踵而至。 最近&#xff0c;我的朋友老张&#xff0c;就真切地体会到了这种“中年危机”。刚过36岁生日&#xff0c;他就收到了来自小米的裁…

从0到1写一个vue2项目,按需引入element-ui的引入,npm下载路由,配置路由,路由嵌套

从0到1写一个vue2项目&#xff0c;此篇内容有element-ui的按需引入&#xff0c;npm下载路由&#xff0c;配置路由&#xff0c;路由嵌套 项目是b站上找的项目链接在此https://www.bilibili.com/video/BV1QU4y1E7qo/?p8&spm_id_frompageDriver&vd_source2c599bf1d75e3f9…

Hive之聚合类开窗函数 + 滑动求和

为什么要写这样子一个主题文章呢&#xff0c;开窗函数毫无疑问&#xff0c;超级重要&#xff0c;但是很多人可能不会遇到一些稍微小众的业务需求&#xff0c;比如说滑动求和。这里带着业务&#xff0c;一并让大家熟悉一些&#xff0c;高阶函数的应用。 0&#xff0c;开窗函数和…

Docker搭建MySQL主从复制

Docker部署MySQL主从复制 文章目录 Docker部署MySQL主从复制一、构建MySQL镜像二、构建systemctl管理MySQL服务镜像三、运行容器四、登录容器4.1、配置master4.2、配置slave 五、授权从库六、更改UUID七、连接主数据库八、验证 一、构建MySQL镜像 我自己是使用的Dockerfile构建…

【JAVA SE】抽象类和接口

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;JAVA 个人主页&#xff1a;Celias blog~ 目录 引言 一、抽象类 1.1 抽象类的定义 1.2 抽象方法 1.3 抽象…

大厂边缘组VS小厂核心组,要怎么选?

有问必答 最近有粉丝提问&#xff1a;大厂边缘组VS小厂核心组&#xff0c;怎么选&#xff1f; 这确实是个好问题&#xff0c;读者老爷们可以先问下自己&#xff1a;如果有一份月薪2W在大厂边缘组打螺丝的Offer且不加班&#xff0c;另外还有一份月薪2W5&#xff0c;在小厂核心…

华为坤灵管理型交换机S300,S500,S310,S210,S220,S200 web端开局配置

一. 准备线缆 笔记本或没有COM口的电脑,需准备转接线,并安装好随线光盘的驱动,检查设备管理器中COM口是否正常 2.连接电脑与交换机的CONSOLE口 二&#xff0c;准备软件putty。 Download PuTTY: latest release (0.81) 配置步骤如下&#xff1a; 开启HTTP服务。设置https://1…

你知道SPI的原理以及实现?

1、什么是SPI&#xff1f; SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;是JDK内置的一种服务提供发现机制&#xff0c;可以用来启用框架扩展和替换组件&#xff0c;主要是被框架的开发人员使用&#xff0c;比如 java.sql.Driver 接口&#xff0c;其他不…

【conda】解决conda activate无效的问题

conda activate 虚拟环境名字执行上述命令失效&#xff0c;提示如下信息&#xff1a; 经查询&#xff0c;原因是新版的 conda 不再使用 activate 来激活虚拟环境&#xff0c;而是改用&#xff1a; source activate 虚拟环境名退出虚拟环境还是&#xff1a; conda deactivate…

sqlite基本操作

简介 文章目录 简介1.数据库的安装2.数据库命令&#xff1a;API&#xff0c;创建表单代码 csprintf&#xff08;&#xff09;getchar和scanf&#xff08;&#xff09; 1.数据库的安装 sudo dpkg -i *.deb这个报错表明出现依赖问题 用这个命令后再试试sudo apt --fix-broken in…

Apache来源于北美印第安部落?

Apache HTTP服务器&#xff0c;通常简称为Apache&#xff0c;是一个由Apache软件基金会&#xff08;Apache Software Foundation&#xff0c;简称ASF&#xff09;维护的开源网页服务器软件。以下是Apache的前世今生的概述&#xff1a; 起源&#xff1a; Apache的起源可以追溯…

计算机组成原理----浮点数的表示和运算

目录 一.浮点数的表示 1.浮点数的作用和基本原理 2.浮点数的规格化 3.浮点数的表示范围 二.IEEE 754标准 三.浮点数的加减运算 1.加减运算 2.强制类型转换 一.浮点数的表示 1.浮点数的作用和基本原理 定点数在字节数固定的情况下&#xff0c;能表示的数字是很有限的&…

输入15个整数,计算并输出15个整数的和,并输出其中最大值和最小值;

输入15个整数&#xff0c;计算并输出15个整数的和&#xff0c;并输出其中最大值和最小值&#xff1b; #include<stdio.h> int main() {int i0,s0,max,min,jg0,jp0,og0,omax; int a[15]{12,13,14,16,17,18,19,10,1,2,3,4,5,6,7}; maxa[0],mina[0]; for(i0,s0;i<15;i) …

Android编程用什么语言:深入探索与开发实践

Android编程用什么语言&#xff1a;深入探索与开发实践 在移动应用开发的浩瀚海洋中&#xff0c;Android平台无疑占据了重要的地位。而对于那些渴望投身于此领域的开发者们来说&#xff0c;选择何种编程语言进行Android编程&#xff0c;无疑是一个关键且充满困惑的问题。本文将…

BIT 2024 编译原理 Lab. 4 四代编译器实验说明和要求

实验四&#xff1a;四代编译器实验 一、实验要求 详细实验要求请参考文件《Lab4实验说明和要求.pdf》。 二、实验思路 1、与 lab3 的对比 如果你在 lab3 就已经像我一样单独写了个函数处理表达式&#xff0c;那么理论上&#xff0c;lab4 相比于 lab3&#xff0c;不过就是多…

ComfyUi安装OOTDiffusion插件的diffusers版本问题

OOTDiffusion换装 在github上有近5K的star了&#xff08;https://github.com/levihsu/OOTDiffusion&#xff09;。 diffusers版本问题 最新版是0.27.2&#xff0c;不能低于0.25&#xff0c;但是OOT换装需要0.24&#xff0c;否则会报错&#xff1a; ComfyUI\custom_nodes\Comf…

系统架构设计师【第14章】: 云原生架构设计理论与实践 (核心总结)

文章目录 14.1 云原生架构产生背景14.2 云原生架构内涵14.2.1 云原生架构定义14.2.2 云原生架构原则14.2.3 主要架构模式14.2.4 典型的云原生架构反模式 14.3 云原生架构相关技术14.3.1 容器技术14.3.2 云原生微服务14.3.3 无服务器技术14.3.4 服务网格 14.4 云原生…