当前位置: 首页 > news >正文

Redisson实现分布式锁示例

一、引入依赖

        <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.0</version></dependency>

二、配置类

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** @Author ZGM* @DateTime 2023/8/15* @description*/
@Configuration
public class RedissonConfig {@Beanpublic RedissonClient redissonClient(){// 配置,Config config = new Config();//单例模式config.useSingleServer().setAddress("redis://127.0.0.1:6379");// .setPassword("123456");//修改看门狗的默认时间30s到60s//config.setLockWatchdogTimeout(60000);// 创建RedissonClient对象return Redisson.create(config);}//这个只针对转化为string类型@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate();template.setConnectionFactory(redisConnectionFactory);//默认是JDK序列化  发现key和value前面都多了一串特殊字符StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();template.setKeySerializer(stringRedisSerializer);template.setValueSerializer(stringRedisSerializer);return template;}
}

三、实现类

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;/*** @Author ZGM* @DateTime 2023/8/15* @description*/
@Service
@Slf4j
public class UserService {@Autowiredprivate RedissonClient redissonClient;@AutowiredRedisTemplate<String, Object> redisTemplate;public void test1() throws InterruptedException {//定义一个keyString key = UUID.randomUUID().toString();// 占锁 没有拿到锁的会自动阻塞// watchDog 机制 : 锁自动加了默认30秒过期// 如果业务代码耗时长,锁也会自动续期RLock lock = redissonClient.getLock(key);//只有lock()和tryLock(5000, TimeUnit.MILLISECONDS)会触发看门狗机制Boolean isLocked = lock.tryLock(5000, TimeUnit.MILLISECONDS);if(!isLocked) {log.info("获取锁失败");}long a = System.currentTimeMillis();try {Thread.sleep(60000);} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}long b = System.currentTimeMillis();System.out.println(b-a);}}

四、测试结果

可以下载redis desktop manager软件来查看redis里面存放的东西
在这里插入图片描述
红色框内的TTL值就是过期时间,默认-1,表示永不过期,指定过期时间后就变成你指定的值了。

上面的方法,我们让线程睡眠60S,代表我们的业务执行时间,在调用这个方法时,我们可以在
redis desktop manager软件上实时查看锁的过期时间,第一次过期时间为30S,10S后刷新过期时间为30S,也就是说,它每隔10S会检验这个锁是否释放,没有的话,会一直给你刷新锁的持有时间变为30S,直到任务完成。

五、看门狗机制

上面所说的自动刷新锁的持有时间,就是通过这个看门狗机制来实现的。它默认的锁的持有时间是30S,每隔30/3也就是10S会刷新锁的持有时间,我们也可以通过redisson的Config 类的config.setLockWatchdogTimeout(60000)来修改过期时间。实际上锁的持有时间就是lockWatchdogTimeout的值,只不过默认设置的30S而已,同样的,锁的刷新时间也是每隔lockWatchdogTimeout/3秒执行一次,如果设置的时间为60S,就是锁的过期时间为60S,每隔20S执行一次。
所谓的自动刷新,其实是在获取锁的时候,开了一个线程来监控这个锁,我们先按照默认的30S过期时间来计算,假设当前业务的执行时间在10S之内,在第10S时此线程监控到该锁已被正常释放,则不会刷新锁的过期时间,反之,在第10S时此线程监控到该锁仍被此线程持有,那也就是业务还未执行完,它就会帮你刷新过期时间。即使redis的服务器宕机了,也不会出现死锁,因为当它监控到异常时,也不会刷新过期时间,当redis的服务器恢复时,自动就把它删除了。

六、注意

注意:只有只有lock()和tryLock(waitTime, TimeUnit.MILLISECONDS)会触发看门狗机制,在这两个方法里我们都没有指定releaseTime,它默认值就是-1,然后才能自动触发看门狗机制,或者我们在调用获取锁的方法时直接指定releaseTime为-1,这样也可以触发看门狗机制,一定要注意这一点。
lock()会一直尝试获取锁,知道成功
tryLock(long time, TimeUnit unit),同样会一直尝试获取锁,但它有等待时间,超过这个时间就直接返回false,不在继续调用,我比较喜欢这个方法。

七、建议

看门狗机制虽然可以自动刷新锁的过期时间,用起来也非常方便,但并不是说,所有的方法,都应该开启此机制。因为启动此机制的同时,意味着会额外开启一个线程来监控它,那么就会占用CPU内存。少量线程的情况下,这部分内存占用可以忽略,当请求过多时,就占用比略高了,只能增加服务器,也就是增加成本了。

所以我建议是,在获取资源的方法里,不开启看门狗机制,比如,一个接口是返回个人信息的,那么我在调用时,由于某种原因导致锁已经释放,但业务还未执行完成,那么会报错,
信息如下:[Request processing failed; nested exception is java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 62e61f35-6cd5-4fc2-849e-78ad649435e4 thread-id: 72] with root cause,我们直接捕获此异常,返回系统繁忙即可。

在更新或者保存资源的方法里,是可以开启看门狗机制的,这样虽然执行时间会稍微长一些,但最终会完成任务,不至于让用户重复操作。

相关文章:

Redisson实现分布式锁示例

一、引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.0</version></dependency>二、配置类 import org.redisson.Redisson; import org.redisson.api.RedissonClient;…...

使用Nginx作为一个普通代理服务器

使用Nginx作为一个普通代理服务器, 请不要用于违法用途哦 nginx作为一个反向代理工具&#xff0c;除了可以进行反向代理之外&#xff0c;还可以用来作为代理工具来使用&#xff0c;作为代理工具使用的步骤如下&#xff0c;这个配置目前支持80端口 Windows系统代理设置对应IP, …...

chatglm2-6b模型在9n-triton中部署并集成至langchain实践 | 京东云技术团队

一.前言 近期&#xff0c; ChatGLM-6B 的第二代版本ChatGLM2-6B已经正式发布&#xff0c;引入了如下新特性&#xff1a; ①. 基座模型升级&#xff0c;性能更强大&#xff0c;在中文C-Eval榜单中&#xff0c;以51.7分位列第6&#xff1b; ②. 支持8K-32k的上下文&#xff1b…...

Shell编程之正则表达式(非常详细)

正则表达式 1.通配符和正则表达式的区别2.基本正则表达式2.1 元字符 &#xff08;字符匹配)2.2 表示匹配次数2.4 位置锚定2.5 分组 和 或者 3.扩展正则表达式4.部分文本处理工具4.1 tr 命令4.2 cut命令4.3 sort命令4.4 uniq命令 1.通配符和正则表达式的区别 通配符一般用于文件…...

RNN模型简单理解和CNN区别

目录 神经网络&#xff1a;水平方向延伸&#xff0c;数据不具有关联性 ​ RNN&#xff1a;在神经网络的基础上加上了时间顺序&#xff0c;语义理解 ​RNN: 训练中采用梯度下降&#xff0c;反向传播 ​ 长短期记忆模型 ​输出关系&#xff1a;1 toN&#xff0c;N to N 单入…...

【Axure高保真原型】JS日期选择器筛选中继器表格

今天和大家分享JS日期选择器筛选中继器表格的原型模板&#xff0c;通过调用浏览器的日期选择器&#xff0c;所以可以获取真实的日历效果&#xff0c;具体包括哪一年二月份有29天&#xff0c;几号对应星期几&#xff0c;都是真实的&#xff0c;获取日期值后&#xff0c;通过交互…...

android bp脚本

一。android大约从7.0开始引入 .bp文件代替以前的.mk文件&#xff0c;用于帮助android项目的编译配置文件。 二。mk文件转化为bp文件&#xff0c;可以使用下面命令转化&#xff0c;注意命令中>&#xff0c;这是写入文件。androidmk是android源码自带的工具&#xff0c;他可…...

Redis 数据库 NoSQL

目录 一、NoSQL 二、为什么会出现NoSQL技术 三、NoSQL的类别 键值&#xff08;Key-Value&#xff09;存储数据库 列存储数据库 文档型数据库 图形&#xff08;Graph&#xff09;数据库 四、NoSQL适应场景 五、在分布式数据库中CAP原理 1、CAP 2、BASE 一、NoSQL NoS…...

RN 项目异常问题整理

常见问题 无法找到 CardStackStyleInterpolator StackViewStyleInterpolator 这个方法集来代替 CardStackStyleInterpolator的&#xff0c;这个方法集的路径也需要注意一下&#xff0c;在2.12.1版本之前&#xff0c; 该文件在react-navigation/src/views/StackView/中&#xf…...

STM8编程[TIM1多路PWM输出选项字节(Option Byte)操作和IO复用]

TIM1多路PWM输出选项字节(Option Byte)操作和IO复用 本文摘录于&#xff1a;https://blog.csdn.net/freeape/article/details/47008033只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 代码上要使用TIME1输出3路PWM,代码如下: void tim…...

Java算法_ 反转二叉树(LeetCode_Hot100)

题目描述&#xff1a;给你一棵二叉树的根节点 &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。root。 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码 /*** 2 * Author: LJJ* 3 * Date: 2023/8/16 13:18* 4*/public class In…...

C/C++ 标准模版库STL(持续更新版)

标准模版库STL 目录 算法库 栈 队列 向量 映射 列表 双向链表 集合 Iterator 送代器 <algorithm> 算法库 max, min 用于找出一组值中的最大值和最小值 swap 用于交换两个变量的值 sort 用于对一个范围内的元素进行排序 lower_bound, upper_bound 用于在已排序的容器…...

ARM(实验二)

uart4.h #ifndef __H__ #define __H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//RCC/GPIO/UART4章节初始化 void hal_uart4_init();//发送一个字符函数 void hal_put_char(const char str);//发…...

由“美”出发 听艺术家林曦关于美育与智慧的探讨

不久前&#xff0c;林曦老师与我们的老朋友「十点读书」进行了一次线上直播&#xff0c;有关林曦老师十余年的书法教学&#xff0c;和传统美育的心得&#xff0c;以及因此诞生的新书《无用之美》。      这一次的直播&#xff0c;由“美”的主题出发&#xff0c;延伸出美育…...

Serial与Parallel GC之间的不同之处是什么?

Serial GC(串行垃圾回收器)和Parallel GC(并行垃圾回收器)都是Java虚拟机(JVM)中用于进行垃圾回收的两种基本算法。它们在性能、资源利用和回收效率等方面存在一些不同之处。下面是它们之间的详细比较&#xff1a; 1.工作方式 Serial GC&#xff1a;它是一种单线程的垃圾回收器…...

GB28181设备接入侧如何对接外部编码后音视频数据并实现预览播放

技术背景 我们在对接GB28181设备接入模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;好多开发者期望能提供编码后&#xff08;H.264/H.265、AAC/PCMA&#xff09;数据对接&#xff0c;确保外部采集设备&#xff0c;比如无人机类似回调过来的数据&#xff0c;直接通过模…...

【java】为什么文件上传要转成Base64?

文章目录 1 前言2 multipart/form-data上传3 Base64上传3.1 Base64编码原理3.2 Base64编码的作用 4 总结 1 前言 最近在开发中遇到文件上传采用Base64的方式上传&#xff0c;记得以前刚开始学http上传文件的时候&#xff0c;都是通过content-type为multipart/form-data方式直接…...

SCSS 学习笔记 和 vscode下载live sass compiler插件配置

1、下载livelive sass compiler插件并配置 // 在 已有代码 下面 添加下面 代码&#xff0c;一般刚刚下载打开最后一行是&#xff1a;// "liveSassCompile.settings.autoprefix": [],// 所以直接 把下面复制进去保存就行"liveSassCompile.settings.autoprefix&qu…...

CSS中的字体属性有哪些值,并分别描述它们的作用。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ font-style⭐ font-weight⭐ font-size⭐ font-family⭐ font-variant⭐ line-height⭐ letter-spacing⭐ word-spacing⭐ font⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专…...

机器学习笔记之优化算法(十五)Baillon Haddad Theorem简单认识

机器学习笔记之优化算法——Baillon Haddad Theorem简单认识 引言 Baillon Haddad Theorem \text{Baillon Haddad Theorem} Baillon Haddad Theorem简单认识证明过程证明&#xff1a;条件 1 ⇒ 1 \Rightarrow 1⇒ 条件 2 2 2证明&#xff1a;条件 3 ⇒ 3 \Rightarrow 3⇒条件 1…...

忍者像素绘卷部署案例:高校数字媒体实验室低成本构建像素艺术教学平台

忍者像素绘卷部署案例&#xff1a;高校数字媒体实验室低成本构建像素艺术教学平台 1. 项目背景与需求分析 数字媒体艺术教育正面临新的挑战与机遇。某高校数字媒体实验室在2023年教学评估中发现&#xff1a; 传统像素艺术教学依赖商业软件&#xff0c;授权费用高昂学生创作受…...

告别‘塑料感’渲染:IBGS如何用‘颜色残差’让3D高斯重建的物体更真实?

告别‘塑料感’渲染&#xff1a;IBGS如何用‘颜色残差’让3D高斯重建的物体更真实&#xff1f; 当你在虚拟场景中看到一个金属茶壶时&#xff0c;是否总觉得它像玩具一样缺乏真实感&#xff1f;这就是当前3D高斯溅射&#xff08;3DGS&#xff09;技术面临的"塑料感"困…...

浅谈MIKE URBAN转SWMM的方法

01 前言近期有群友咨询MIKE URBAN怎么转换成SWMM的INP文件格式&#xff0c;其实这个是很简单的&#xff0c;前提是你对两个软件格式足够熟悉&#xff0c;另一方面&#xff0c;很多年前SWMM就开发了inpPNS软件。可以利用这个软件便可实现转换&#xff0c;小编抽时间给大家分享下…...

告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案

告别桌面混乱&#xff1a;NoFences让文件管理效率提升80%的空间收纳方案 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 每天在杂乱的桌面图标中寻找文件&#xff0c;就像在堆…...

RTX3070 + CUDA 11.0 实战:手把手教你从零搭建 PointNet.pytorch 环境(附常见报错解决)

RTX3070 CUDA 11.0 实战&#xff1a;手把手教你从零搭建 PointNet.pytorch 环境&#xff08;附常见报错解决&#xff09; 当你手握一块RTX3070显卡&#xff0c;想要复现PointNet这一经典点云处理网络时&#xff0c;是否曾被环境配置的各种坑绊住脚步&#xff1f;本文将带你避开…...

告别环境冲突!在PyCharm里用Anaconda为ArcGIS 10.2创建专属Arcpy虚拟环境(附32/64位切换指南)

告别环境冲突&#xff01;在PyCharm里用Anaconda为ArcGIS 10.2创建专属Arcpy虚拟环境&#xff08;附32/64位切换指南&#xff09; 当你在处理多个GIS项目时&#xff0c;是否经常遇到这样的困扰&#xff1a;一个项目需要ArcGIS 10.2的32位环境&#xff0c;另一个项目却需要64位…...

MemMA:多智能体驱动的记忆自进化框架

&#x1f4cc; 一句话总结&#xff1a; 本工作提出 MemMA&#xff0c;一个通过多智能体协同与自进化机制统一优化“记忆构建-检索-利用”循环的框架&#xff0c;显著提升长程记忆推理能力。 &#x1f50d; 背景问题&#xff1a; 当前 memory-augmented LLM agent 存在两个核…...

生成单颗10mm级配的cluster骨料

PFC5.0代码&#xff0c;可以破碎的cluster&#xff0c;可模拟碎石、矿渣混凝土材料&#xff0c;ball与cluster颗粒&#xff0c;单轴压缩实验&#xff0c;内涵声发射事件数代码&#xff0c;分析统计ball与ball直接的裂纹数目&#xff0c;cluster内部破碎的裂纹数目上周帮同门调P…...

VMware 虚拟机 Kali Linux 光标消失?五步实操攻略轻松找回

在 VMware Workstation Pro 中运行 Kali Linux 时&#xff0c;不少用户会遇到 “光标隐形” 的棘手问题 —— 系统可正常操作&#xff0c;但光标一进入虚拟机窗口就消失。这一现象多由硬件兼容性、驱动配置或增强工具缺失导致&#xff0c;并非硬件故障。本文整合社区实测有效方…...

2025年SQL2API平台深度评测:QuickAPI、dbapi与Magic API的实战应用指南

1. 2025年SQL2API平台的核心价值与应用场景 在数据爆炸的时代&#xff0c;企业每天产生的数据量呈指数级增长。我曾参与过一个零售企业的数据中台项目&#xff0c;他们的商品数据分散在5个不同系统的数据库中&#xff0c;光是整理基础数据接口就耗费了团队两周时间。直到我们引…...