Redisson分布式锁
目录
- 一,场景说明
- 二,Redisson分布式锁
- 1,引入依赖
- 2,生成RedissonClient对象
- 3,测试
- 三,说明
一,场景说明
为什么需要分布式锁呢?
- 如果是单机服务,即只有一台服务器,那就不需要分布式锁,在代码中加锁就可以满足需求了。
- 在分布式环境下,服务都是部署在多台机器,普通锁已经无法满足需求了。以下面这个场景为例:
有一个创建人员信息的模块,前端页面中输入人员相关信息,点击“保存”按钮发送请求,后端收到请求后开始处理,生成主键ID及其它信息,安全起见可以在保存人员信息方法上加一个synchronized锁或者是ReentrantLock锁,最后将人员信息保存到数据库中。假如:前端没有控制好,第一次点击“保存”按钮后,并没有将按钮置为无效,客户点了两次“保存”按钮,发送了两次请求,这样会怎么样?
- 上述场景如果是在单机环境下,是没有问题的,因为加了锁,即使发送两次请求,第二次请求也会被阻塞,等第一次请求执行完后才会执行,代码中再加入一些判断,判断数据库中是否已存在该人员信息,如果存在,不执行insert,返回人员信息即可。
- 如果是在分布式环境下,服务部署一般都会采用Nginx来转发前端请求,如果Nginx采用轮询方式,第一次请求发送到A服务器,第二次服务发送到B服务器,两台服务器中获取synchronized锁都获取成功,在数据库中查询发现不存在人员信息,两台服务器都执行insert操作,最后数据库中一个人员信息生成了两台数据,出现问题。
出现上述情况,就可以用Redisson的分布式锁来解决。通过Redisson的单线程特性,在保存人员信息前先获取锁,获取成功后才执行。
二,Redisson分布式锁
1,引入依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.11.2</version>
</dependency>
2,生成RedissonClient对象
@Configuration
public class RedissonConfig {@Beanpublic RedissonClient redissonClient(){Config config = new Config();// 连接Redis,如果Redis设置了密码可以通过setPassword()指定密码config.useSingleServer().setAddress("redis://192.168.1.5:6379");return Redisson.create(config);}
}
3,测试
@GetMapping("/user")
public class UserController{@Autowiredprivate UserService userService;@Autowiredprivate RedissonClient redissonClient;@PostMappingpublic User save(User user){userService.save(user);}
}
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Autowiredprivate RedissonClient redissonClient;@Autowiredprivate StringRedisTemplate stringRedisTemplate;public User save(User user) {String key = "add_user_lock";RLock lock = null;try {lock = redissonClient.getLock(key+user.getPsnNo());while (true) {if (lock.tryLock()) {break;}Thread.sleep(1000);}//业务代码String user=stringRedisTemplate.opsForValue().get(user.getPsnNo());if(user){return (User)user;}else{User user = userDao.save(user);//保存人员信息stringRedisTemplate.opsForValue().set(user.getPsnNo(),user.toString());return user;}} catch (Exception e) {e.printStackTrace();} finally {if (null != lock && lock.isHeldByCurrentThread()) {lock.unlock();}}}
}
三,说明
- 通过Redis的单线程可以实现分布式锁,在第一次获得锁之后进行人员信息的保存,并将人员信息以人员编号,比如人员身份证号为key,存入到Redis中,第二次获得锁的请求,会先去Redis中查询是否存在人员信息,因为第一次请求已经将数据放入redis,第二次请求发现Redis中有数据,直接返回,防止插入多条数据。
- Redisson除了上面的可重入锁外,还有其它的锁,可以根据实际情况进行选择。
//可重入锁
RLock lock = redissonClient.getLock("lock");
//公平锁
RLock lock = redissonClient.getFairLock("lock");
//信号量
RSemaphore semaphore = redissonClient.getSemaphore("semaphore");
semaphore.trySetPermits(3);
相关文章:
Redisson分布式锁
目录一,场景说明二,Redisson分布式锁1,引入依赖2,生成RedissonClient对象3,测试三,说明一,场景说明 为什么需要分布式锁呢? 如果是单机服务,即只有一台服务器ÿ…...
LOF(Local Outlier Factor)原理
文章目录1定义2 k近邻距离(k-distance of an object p)3 k近邻4 可达距离5 局部可达密度6 lof参考:1定义 LOF(Local Outlier Factor)是一种描述异常值的方法。 2 k近邻距离(k-distance of an object p&am…...
[ vulhub漏洞复现篇 ] Drupal<7.32 Drupalgeddon SQL注入漏洞(CVE-2014-3704)
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
Part 4 描述性统计分析(占比 10%)——下
文章目录【后续会持续更新CDA Level I&II备考相关内容,敬请期待】【考试大纲】【考试内容】【备考资料】【扩展知识】4、相关分析4.1、相关分析的描述——散点图4.2、相关分析的类型4.3、相关分析的度量4.3.1、协方差4.3.2、相关系数【后续会持续更新CDA Level …...
【一般人不会告诉你】比肩chatgtp的5款AI网站
话不多说,直接上连接 1. Dall-E: https://labs.openai.com/ 2. Codeformer: https://shangchenzhou.com/projects/Co... 3. Playground AI: https://playgroundai.com/ 4. Clip Drop: https://clipdrop.co/relight 5. Astria: https://www.strmr.com/examples …...
LA@相似方阵和对角化
文章目录相似方阵相似矩阵和特征值小结方阵相似对角化结论推论对角化方法归纳例方阵高次幂相似方阵 对角阵是矩阵中最简单的一类矩阵 对角阵相关的乘法运算是很高效的相似方阵是和对角阵相关的概念 设A和B是n阶方阵,如果存在n阶可逆方阵P,使得P−1APBP^{-1}APBP−1APB,则称方阵…...
存储类别、链接与内存管理(二)
0、前言概要 本篇来自于我的另外一篇博客存储类别、链接与内存管理(一)的续篇,主要分析了C语言中的不同存储类别、关键字以及使用的注意事项 1、自动变量 (1)属性 自动存储期、块作用域、无连接 (2&a…...
JavaScript 入门教程||javascript 简介||JavaScript 用法
javascript 简介JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。JavaScript 是脚本语言JavaScript 是一种轻量级的编程语言。JavaScript 是可插入 HTML 页面的编程代…...
新闻稿写作指南
当你想要传达一则新闻,写一份新闻稿是非常必要的。新闻稿的目的是让读者了解某个事件或信息,以及提供与之相关的背景信息和重要细节。以下是新闻稿的写作指南,帮助你写出一份清晰、简洁、有价值的新闻稿。1、选择一个有新闻价值的主题你的新闻…...
一文详解Redis持久化的两种方案
一文详解Redis持久化的两种方案1.RDB持久化2.RDB持久化原理3.AOF持久化4.RDB VS AOF1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,…...
第六章 - 数据过滤where(where与and和or的组合用法)
第六章 - 数据过滤(where的用法)基本用法where的条件限制符等于号不等号! 或者<>小于<大于>小于等于<大于等于>between 的用法空值和非空值组合条件 and组合条件 orand 和 or 的计算次序in 和 not in基本用法 在查询语句中࿰…...
Oracle 定时任务例子
背景: 创建一个Oracle的定时任务,每天或指定时间 -----定义存储过程 create or replace procedure AAA_BBB as begin insert into AAA select * from BBB; commit; end; ----------------创建定时任务 declare xjobid number; begin DBMS_JOB.SUBM…...
Android常用9种自动化测试框架对比,Appium有哪些优势?
随着移动终端的普及,手机应用越来越多,也越来越重要。 App的回归测试用例数量也越来越多,全量回归也越来越消耗时间。移动 APP自动化测试 的难点移动 APP的UI自动化测试长久以来一直是一个难点,难点在于UI的”变”, 变化导致自动化…...
在vue2使用百度脑图的kityminder-core进行二次开发思维导图,给节点绑定数据后添加新的图标
需求说明:在给某个节点绑定文件数据后,用户并不能一眼看出哪个节点上绑定了数据,因此需要在绑定文件数据后给节点上加一个图标用于标识。 添加图标 1、在kityminder-core/src/module/file.js文件中添加代码 (file.js文件如何添加…...
FPGA时序约束与分析 --- 时序约束概述
本系列参考文献 — FPGA时序与约束分析-吴厚航 FPGA从综合到实现需要的过程如下:synth_design -> opt_design -> place-design -> phys_opt_design -> route_design 1、时序约束的理解 2、时序约束的基本路径 3、时序约束的步骤 4、时序约束的主要方法…...
2022——寒假总结
文章目录背景报名摸索结果总结背景 大一上学期,刚上大学没有尽快适应,什么都没有学到。 因为疫情,所以平时的测试以及期末都是线上进行的,就没怎么认真学,网课直接划水。 我的生活与学习很不平衡,还热衷于参…...
C++11 Lambda表达式
文章首发公众号:iDoitnow 为什么引入Lambda Lambda表达式是一个可以内联在我们代码中的函数,我们可以将他传递给另外一个函数。在没有引入Lambda表达式之前,当我们遇到需要对多个数据,按照同一规则进行操作的时候,创建…...
冰湖灾害遥感监测评价与模拟分析
查看原文>>>mp.weixin.qq.com/s?__bizMzAxNzcxMzc5MQ&mid2247582638&idx1&sna22a1697b16a5edc2b74cb1ccf011689&chksm9be29cbeac9515a8227460103ae1b9f280af688eab0ce5a43448f9fa7c9cab820c389fcdc031&token10630879&langzh_CN#rd【专家简介…...
Highcharts.Chart
Highcharts 是一个使用javascript 脚本来生成图表的工具,和jfreechart 作用类似,都用来生成各种图表,并支持图片的导出和打印。 从官网 www.highcharts.com 上下载的压缩表中的example中有各种图表的例子。 要编写生成图表的例子建议从 文…...
遍历map的几种方法
#先往map加入几个数据 Map<Integer,String> mapnew HashMap<>(); map.put(1,"美好的周一"); map.put(2,"美好的周二"); map.put(3,"美好的周三"); 1 2 3 4 方法一:普通的foreach循环,…...
终极免费窗口强制调整工具:如何突破Windows尺寸限制
终极免费窗口强制调整工具:如何突破Windows尺寸限制 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽的"顽固窗口"而烦恼吗?Wi…...
MSP430F5438 RTC模块配置与低功耗应用实战指南
1. 项目概述与核心价值最近在整理一个老项目的资料,翻到了当年用TI的MSP430F5438做的一个数据记录仪。这个项目里,实时时钟(RTC)模块的稳定性和低功耗配置是关键,当时为了搞定它,可没少花功夫。今天就把关于…...
一文读懂:文档解析、RAG、知识库及文档Agent
AI会取代人类工作吗?斯坦福大学教授、AI领域顶尖学者吴恩达近日明确表示:不会有AI就业末日。在他看来,AI会影响岗位、改变技能要求、替代部分任务,但将其描绘成大规模失业灾难,“是在制造不必要的恐惧,也是…...
别再死记硬背了!用这个班级排名的例子,5分钟搞懂R语言dplyr包的四种join函数
班级运动会排名解析:用生活案例彻底掌握R语言dplyr连接函数 刚接触R语言的数据合并操作时,那些inner_join、left_join的术语总让人望而生畏。但数据连接的本质,其实就像学校运动会后整理各班成绩一样简单。想象你手上有两个班级的排名表和运动…...
RTSP拉流播放器开发实战:用FFmpeg和SDL2解析H264 RTP流
RTSP拉流播放器开发实战:用FFmpeg和SDL2解析H264 RTP流 在实时视频监控、在线直播等场景中,RTSP协议因其低延迟和可靠性成为主流选择。本文将深入探讨如何从零构建一个RTSP客户端播放器,重点解决H264 RTP流的接收、解析与渲染难题。不同于简单…...
告别Centerness和IoU-Net:聊聊GFLv2如何用‘边框分布统计’更准地评估定位质量
目标检测定位质量评估的范式革新:从启发式设计到统计驱动 在目标检测领域,定位质量评估(Localization Quality Estimation, LQE)一直是个微妙却关键的问题。想象一下这样的场景:当两个检测框都包含了目标物体…...
PMP认证深度解析:从知识体系到实战应用的全方位指南
1. 项目概述:从“认证”到“职业语言”的深度解码当你在项目管理圈子里待久了,会发现一个有趣的现象:无论大家来自哪个行业——是互联网大厂的产品研发,还是传统制造业的产线升级,甚至是大型活动的策划执行——只要聊到…...
PDF怎么另存为JPG?5款工具2026年实测对比,电脑和手机都能用
想要把PDF文件转换成图片格式?无论是为了方便分享、减小文件大小,还是为了在不同平台使用,PDF转JPG都是一个常见需求。这篇文章就为你详细介绍PDF另存为JPG的多种方法,涵盖电脑和手机两大场景,让你快速找到最适合自己的…...
终极Il2CppDumper使用指南:从原理到实战的Unity逆向工程利器
终极Il2CppDumper使用指南:从原理到实战的Unity逆向工程利器 【免费下载链接】Il2CppDumper Unity il2cpp reverse engineer 项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper Il2CppDumper是一款强大的Unity il2cpp逆向工程工具,能够帮…...
经典的网格寻路问题实例分析
经典的网格寻路问题消除墙砖 这一设置会导致地形发生变化,增加问题处理的难度。让我们先去掉这一要求,这样题目就简化成了经典的 网格寻路问题:给你一个 的网格,其中每个单元格不是 (空)就是 (障…...
