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循环,…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
