Springboot整合Redission分布式锁使用实例

Springboot整合Redission分布式锁

引言:实际项目中,我们经常会遇到一些需要考虑使用分布式锁的场景,以防止页面重复请求或者多系统之间相互重复调用的产生业务偏差的问题;
例如:
1.并发的场景下,生成订单需要进行使用分布式锁来锁定商品库存,避免出现超卖情况。
2.定时任务,部署多个服务,存在某些任务被同时执行的情况;

一、springboot引入redission依赖;

        <!-- redis 分布式锁 --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.5.0</version></dependency>

二、配置redis链接信息:实际各配置信息根据项目具体情况而定

##默认密码为空
redis:host: 127.0.0.1port: 6379jedis:pool:#连接池最大连接数(使用负值表示没有限制)max-active: 100# 连接池中的最小空闲连接max-idle: 10# 连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: 100000timeout: 5000database: 1

三、RedissonClient客户端配置(单机模式)

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 单机模式分布式锁配置*/@Configuration
public class RedissionConfig {@Value("${redis.host}")private String redisHost;@Value("${redis.port}")private String redisPort;@Value("${redis.database}")private int database;@Bean(destroyMethod = "shutdown")public RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort).setDatabase(database);return Redisson.create(config);}
}

四、测试
4.1 lockTest1方法对锁进行锁定,让现场睡眠1分钟,模拟业务一直占用锁的场景;
4.2 lockTest2 在业务1执行时候尝试去获取锁,看是否能获取到锁,同时等30秒后锁过期再去获取锁,是否可以正常获取到锁;

	@Resourceprivate RedissonClient redissonClient;@ApiOperation(value = "分布式可重入锁测试1", notes = "分布式锁测试1")@PostMapping("/lockTest1")Result lockTest1(@RequestBody RedisRequestDto dto){RLock lock = redissonClient.getLock(dto.getKey());String message = "";try {// lock.lock(); 会有看门狗机制,默认30秒;
//            lock.lock();// 此处采用手动设置过期时间,不会触发看门狗机制boolean locked = lock.tryLock(30, 60, TimeUnit.SECONDS);if(locked){message = "lockTest1 == 锁成功了";log.info(message);}else {message = "lockTest1 == 1锁失败了";log.info(message);}Thread.sleep(60000);} catch (InterruptedException e) {e.printStackTrace();}finally {if(Objects.nonNull(lock) && lock.isHeldByCurrentThread()){log.info("{}锁被释放",dto.getKey());lock.unlock();}}return Result.ok(message);}@ApiOperation(value = "分布式可重入锁测试2", notes = "分布式锁测试2")@PostMapping("/lockTest2")Result lockTest2(@RequestBody RedisRequestDto dto){RLock lock = redissonClient.getLock(dto.getKey());try {boolean isLocked = lock.isLocked();if(isLocked){log.info("{}锁被占用,请稍后",dto.getKey());return Result.ok("锁占用,请稍后");}else {log.info("{}锁未占用,继续执行",dto.getKey());return Result.ok("锁未占用,继续执行");}} catch (Exception e) {e.printStackTrace();}finally {if(Objects.nonNull(lock) && lock.isHeldByCurrentThread()){lock.unlock();}}return Result.ok("");}

测试结果:
请求参数如下:
在这里插入图片描述

1.lockTest1 执行以后,我们可以看到有在db1中有一条记录,同时返回锁成功;
在这里插入图片描述
2.lockTest2 执行时候就是锁占用,证明“test_lock”已经被占用,无法获取;
在这里插入图片描述
3.等待30秒以后,test_lock锁自动过期,再次执行lockTest2,可以正常获取到锁;
在这里插入图片描述
通过日志,我们也能看出整个锁的锁定和释放的情况;

2024-01-15 15:15:13.560  INFO 191576 --- [nio-1012-exec-1] c.s.house.controller.RedisController     : lockTest1 == 锁成功了
2024-01-15 15:15:16.960  INFO 191576 --- [nio-1012-exec-3] c.s.house.controller.RedisController     : test_lock锁被占用,请稍后
2024-01-15 15:16:24.566  INFO 191576 --- [nio-1012-exec-5] c.s.house.controller.RedisController     : test_lock锁未占用,继续执行

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

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

相关文章

WSL2-Ubuntu20.04-配置

WSL2-Ubuntu20.04-配置 安装wsl2安装Ubuntu20.04安装anacondaWSL2可视化&#xff08;VcXsrv&#xff09; 安装wsl2 wsl --install wsl -l -v # 版本查看 默认的都是 wsl2 &#xff08;如果是wsl1 就自行升级 wsl --update&#xff09; 官方教程 安装Ubuntu20.04 安装wsl2之后…

Unable to start embedded Tomcat Nacos启动报错

Nacos报错解决 报错信息&#xff1a;Unable to start embedded Tomcat 无法加载内置的tomcat。 无需重新配置JDK&#xff0c;轻松解决 Windows 系统为例 startup.cmd 操作步骤如下&#xff1a; 在nacos解压后的文件中&#xff0c;进入bin目录下如图1所示&#xff1a; 在红框中…

ACL16_S 系列 低成本物联网安全芯片,可应用物联网认证、 SIM、防抄板和设备认证等产品上

ACL16_S 芯片是针对物联网认证、 SIM、防抄板和设备认证需求推出的高安全芯片。芯片采用 32 位 ARMCortex™-M0 系列内核&#xff0c;片内集成多种安全密码模块&#xff0c;包括 RSA/ECC DES/TDES、 SHA-1/-256、 AES-128/-192/-256 等国际安全算法&#xff0c;支持真随机数发…

【OpenCV学习笔记13】- 【彩蛋】提取多个彩色对象

这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子&#xff0c;也会给出自己根据官方的例子完成的更改代码&#xff0c;同样彩蛋的实现也会结合多个知识点一起实现一些小功能&#xff0c;来帮助我们对学会的知识点进行结合应用。 如果有喜欢我笔…

如何构建高质量,低成本的移动机器人(AGV/AMR)?

中国移动机器人行业规模的不断扩大&#xff0c;低成本无人化是现市场需求突出的特点之一。然而研发一套完整的移动机器人导航方案不仅需要耗费大量的人力成本&#xff0c;还要经过漫长的市场验证&#xff0c;这将滞后整个产业的发展&#xff0c;并有可能错失市场的抢占先机。 如…

C/C++ 有关质数(素数)的问题

第一题:判断是否为质数 代码&#xff1a; #include <bits/stdc.h> using namespace std; int main() {int a;int flag 1; //重要cin>>a;for(int j2;j<a;j){if(a % j 0){cout<<a<<"不是质数";flag0; …

点击切换图片,样式

切换场景&#xff1a; 本文章向大家介绍uniapp之 点击图片切换&#xff0c;使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参考一下。 提示&#xff1a;点击时进行角色切换&#xff0c;【图片切换&#xff0c;并…

GoZero微服务个人探索之路(三)Go-Zero官方rpc demo示例探究

官方网址&#xff1a;https://go-zero.dev/docs/tasks/cli/grpc-demo 项目结构 demo包 两个文件均为protoc-gen-go-grpc自动生成构成一个完整的 gRPC 服务的定义和实现 democlient包 demo.go goctl生成的客户端代码 Request 和 Response 别名&#xff1a; 定义了 Request 和…

图片里面的水印怎么去除

我们经常会在网络上看到各种带有水印的图片。那么在摄图网下载的图片都带有水印&#xff0c;我们该怎么去除让我们让图片更完美无瑕呢然而&#xff0c;这时候心中就有一个疑问了如何去除图片上的水印呢?接下来&#xff0c;我将为您介绍一种常见的方法。 那就是我们的水印云了…

内部软件产品数据治理平台(流程设计里,选择触发事件报错)

内部软件产品数据治理平台(流程设计里&#xff0c;选择触发事件报错) 页面报错如下 通过查看dp后台日志发现缺少表字段,表名称(TL_EVENT_SHADOW),需要新增字段即可 PROJECT_ID varchar(200) DEFAULT NULL COMMENT ‘对象所属项目ID’, SPACE_ID varchar(20) DEFAULT ‘0’ C…

Android Firebase (FCM)推送接入

官方文档&#xff1a; 向后台应用发送测试消息 | Firebase Cloud Messaging 1、根级&#xff08;项目级&#xff09;Gradlegradle的dependencies中添加&#xff1a; dependencies {...// Add the dependency for the Google services Gradle pluginclasspath com.google.gm…

(学习日记)2024.01.13:一份关于自行车定位的调研 2

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

CentOS离线安装MongoDB

目录 1、下载 2、上传并解压 3、创建目录 4、新建配置文件 5、启动 6、验证 7、停止服务 7.1 快速停止 7.2 标准的关闭方法 1、下载 下载MongoDB对应的压缩包&#xff0c;本次使用的是4.0.10版本&#xff0c;点击下载 2、上传并解压 把压缩包上传到服务器&#xff0c…

支付宝和微信支付对接流程

支付宝简介 使用流程 支付宝开放平台 (alipay.com) 1、登录支付宝开放平台-创建应用 得到app_id 2、绑定应用&#xff1a;在产品绑定中&#xff0c;绑定支付宝的相关功能3、配置应用&#xff1a; 配置各种加密方式 4、提交审核&#xff1a;5、把支付宝整个功能整合项目 沙箱…

基于Web的航空航天数字博物馆推荐系统

介绍 项目背景&#xff1a; 航空航天数字博物馆推荐系统是一个基于Web开发的应用&#xff0c;旨在为用户提供一个全面的航空航天领域的数字博物馆体验。通过展品展示、分类筛选和个性化推荐等功能&#xff0c;用户可以更好地了解航空航天知识和文化&#xff0c;并丰富参观体验…

【计算机组成-算术逻辑单元】

课程链接&#xff1a;北京大学陆俊林老师的计算机组成原理课 1. 算术运算和逻辑运算 算数运算 逻辑运算 算数逻辑运算的需求 算数运算&#xff1a;两个32-bit数的加减法&#xff0c;结果为一个32-bit数&#xff1b;检查加减法的结果是否溢出逻辑运算&#xff1a;两个32-bit数…

【JavaScript】js实现滚动触底加载事件

一、html和css 可视区固定500px&#xff0c;设置overflow-y: auto 来实现滚动。 1.1、html <template><div class"scroll"refscrollscroll"onScroll"><div class"crad"v-for"i in 10":key"i"></div&…

【目标检测】YOLOv7算法实现(一):模型搭建

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github&#xff0c;删减了源码中部分内容&#xff0c;满足个人科研需求。   本系列文章在YOLOv5算法实现的基础上&#xff0c;进一步完成YOLOv7算法的实现…

2020年认证杯SPSSPRO杯数学建模C题(第二阶段)抗击疫情,我们能做什么全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情&#xff0c;我们能做什么 原题再现&#xff1a; 2020 年 3 月 12 日&#xff0c;世界卫生组织&#xff08;WHO&#xff09;宣布&#xff0c;席卷全球的冠状病毒引发的病毒性肺炎&#xff08;COVID-19&#xff09;是一种大流行病。…