如何实现Redisson分布式锁

首先,不要将分布式锁想的太复杂,如果我们只是平时业务中去使用,其实不算难,但是很多人写的文章不能让人快速上手,接下来,一起看下Redisson分布式锁的快速实现

Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端(In-Memory Data Grid)。它不仅提供了一系列的 redis 常用数据结构命令服务,还提供了许多分布式服务,例如分布式锁、分布式对象、分布式集合、分布式远程服务、分布式调度任务服务等等。

Redisson:其实就是相当于在redis的基础上进行了加强,让redisson不像redis的分布式是直接基于指令setnx(set if not exists: 如果不存在)去实现的。

开始配置

因为redission是基于redis的,所以我们需要本地安装reids,redis安装这里就不演示了,这里是使用springboot创建的项目,我们默认项目已经创建完成了,所以直接开始配置

项目结构

1、配置redis

#以下是application.yml中的配置
server:port: 8083spring:redis:host: localhostport: 6379timeout: 1000jedis:pool:min-idle: 5max-idle: 10max-wait: -1
2、配置pom.xml 引入相关jar包
        <!-- 引入redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 引入redisson --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.17.7</version></dependency>
3、编写测试并发类
package cn.sendmsg.test;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@RestController
@Slf4j
public class redissonController {@RequestMapping("/testLock")public void  testRedissLock(){// 使用Redisson 设置分布式锁//1、配置Redisson客户端  Config对象用于配置 Redisson 客户端的参数。Config config = new Config();//2、连接地址    连接方式redis://  或者 rediss://// 集群使用// config.useClusterServers()//    .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒//    //可以用"rediss://"来启用SSL连接//    .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")//    .addNodeAddress("redis://127.0.0.1:7002");/**  userSingleServer():指定使用单个redis服务配置*  setAddress() :  设置 Redis 服务器的地址*  setPassWord(): 设置连接 Redis 服务器的密码,如果有的话*  setDatabase(0): 设置连接的数据库索引,0就表示第一个* */config.useSingleServer().setAddress("redis://localhost:6379");//3、 创建Redisson客户端RedissonClient redissonClient = Redisson.create(config);String lockValue = "isLock";// 获取红锁RLock redissonLock = redissonClient.getLock(lockValue);try {// 后去锁,如果获取到返回true// tryLock():尝试3秒内获取锁,如果获取到了,最长3秒自动释放boolean lock = redissonLock.tryLock(3L,3L, TimeUnit.SECONDS);// 获取锁后,开始执行需要加锁的逻辑代码if(lock){System.out.println("获取到锁了");for(int i =0;i<5;i++){log.info("执行逻辑,查看打印结果:{}",i);}}} catch (InterruptedException e) {log.info("获取锁失败,失败原因:{}",e.getMessage());throw new RuntimeException(e);}finally {// 最后一定要释放锁,不然有可能造成死锁现象redissonLock.unlock();}}// 用于jmater测试不加锁的信息,对比看@RequestMapping("/testNoLock")public void  testRedissNoLock(){for(int i =0;i< 10;i++){log.info("无分布式锁的逻辑:"+i);}}}
4、使用jmater测试(这是个压测工具,可以一次性发多个线程,来进行压力测试),这个自行安装以下

以下是jmater工具页面截图,这个花3分钟时间,自己学习下,主要还是设置yml、pom.xml、测试类,这个属于工具

 5、查看本地代码运行结果(注意看打印结果,因为获得了分布式锁,所以在执行代码块for循环时,是顺序的,不然不是顺序的)
获取到锁了
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.840  INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.862  INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.866  INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.869  INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.872  INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController       : 执行逻辑,查看打印结果:4

到这里,其实我们就已经实现Redisson分布式锁了,不要把这个想的太复杂,可能在集群时需要注意些。  示例代码中演示了集群时如何设置。这是一个简单的案例,但实际开发者,获取锁-释放锁也是这么用的。加油

6、不加锁使用jmater打印的信息

不加锁,for循环打印时,输出日志就不是有顺序的

15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:3
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:4
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.081  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:1
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:2
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:3
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:4
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.217  INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.078  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:0
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:1
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:2
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:3
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:4
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.210  INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218  INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:0
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:1
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:2
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:3
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:4
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218  INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:9
2023-11-14 15:00:40.211  INFO 40508 --- [io-8083-exec-26] cn.sendmsg.test.redissonController       : 无分布式锁的逻辑:0

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

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

相关文章

公益SRC实战|SQL注入漏洞攻略

目录 一、信息收集 二、实战演示 三、使用sqlmap进行验证 四、总结 一、信息收集 1.查找带有ID传参的网站&#xff08;可以查找sql注入漏洞&#xff09; inurl:asp idxx 2.查找网站后台&#xff08;多数有登陆框&#xff0c;可以查找弱口令&#xff0c;暴力破解等漏洞&…

SpringBoot和Spring源码下载

1.下载&#xff1a;在一个空的干净地创建一个文件夹叫springsourcecode&#xff0c;其实叫什么都行的。 git clone https://github.com/spring-projects/spring-framework.git 2.JDK要和gradle匹配 我们要21的&#xff0c;今天为止2023年11月13日&#xff0c;idea是2023.2。 …

python数据结构与算法-03_链表

链式结构 上一节讲到了支持随机访问的线性结构&#xff0c;这次我们开始讲链式结构, 视频里我会说下这两种结构的区别&#xff0c;然后讲解最常见的单链表和双链表。 之前在专栏文章那些年&#xff0c;我们一起跪过的算法题[视频]里实现过一个 lru_cache&#xff0c; 使用到的…

考研分享第3期 | 211本378分上岸大连理工电子信息经验贴

考研分享第3期 | 211本378分上岸大连理工电子信息经验贴 一、个人信息 姓名&#xff1a;Ming 本科院校&#xff1a;某211学校电子信息工程学院 电子科学与技术专业 上岸院校&#xff1a;大连理工大学 电子信息与电气工程学部 电子信息&#xff08;0854&#xff09; 择校意…

数据中心:精密空调监控,这招太高效了!

在当今日益复杂的工业环境中&#xff0c;精密空调系统的监控和管理变得至关重要。随着科技的迅猛发展&#xff0c;各行各业对温度、湿度和空气质量等参数的高度控制需求不断增加。 精密空调监控系统通过实时数据采集、分析和反馈&#xff0c;为企业提供了可靠的手段来确保生产环…

给你一个整数 n,请你判断该整数是否是 2 的幂次方。

题意&#xff1a; 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&#xff1a;n 1…

settings.json配置

settings.json配置 {"editor.tabSize": 2,"git.ignoreWindowsGit27Warning": true,"workbench.editor.untitled.hint": "hidden","security.workspace.trust.untrustedFiles": "open","[vue]": {"…

dll文件【C#】

加载方法&#xff1a; [DllImport("controlcan.dll")] public static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved); 文件存放位置&#xff1a; 一般放Debug文件夹下。 运行错误&#xff1a; 原因是CPU位数选择不对&…

不变式和橄榄树-UMLChina建模知识竞赛第4赛季第20轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者…

科普测量开关电源输出波形的三种方法及电源波形自动化测试步骤

开关电源波形测试就是对开关电源的输出波形进行检测和分析&#xff0c;观察开关电源参数变化&#xff0c;以此来判断开关电源的性能是否符合要求。好的开关电源对于设备以及整个电路的正常运行是非常重要的&#xff0c;因此开关电源输出波形测试是开关电源测试的重要环节&#…

数据同步工具调研选型:SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比

产品概述 Apache SeaTunnel 是一个非常易用的超高性能分布式数据集成产品&#xff0c;支持海量数据的离线及实时同步。每天可稳定高效同步万亿级数据&#xff0c;已应用于数百家企业生产&#xff0c;也是首个由国人主导贡献到 Apache 基金会的数据集成顶级项目。 SeaTunnel 主…

无人值守的共享台球室:微信小程序实现自助服务

随着科技的发展和互联网的普及&#xff0c;无人值守的共享台球室已经成为一种新型的娱乐方式。通过微信小程序&#xff0c;消费者可以实现在线预订、自助结账、评价反馈等一站式服务&#xff0c;带来更加便捷、高效的体验。本文将探讨如何利用微信小程序实现无人值守的共享台球…

vue滚动到指定位置

一、首先获取需要滚动的外层容器的宽度 let boxWidth this.$refs.box.offsetWidth二、计算出容器内单个元素的宽度&#xff0c;以12个为例 let itemWidth boxWidth / 12三、计算出容器内单个元素的宽度&#xff0c;以横向滚动&#xff0c;内部12个元素为例 this.$refs.box…

【Ubuntu】安装Docker

一、查看系统基本情况 1.1 查看系统版本 指令一 lsb_release -aNo LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal 指令二 cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE20.04 DISTRIB_CODE…

Flutter笔记 - 关于 fit 属性以及相关知识的总结

Flutter笔记 关于 fit 属性以及相关知识的总结 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/13434451…

软考高级职称哪个好考?明确给你答案

软考考试分为初、中、高三级&#xff0c;其中高级5个方向分别为系统分析师、信息系统项目管理师、网络规划设计师、系统架构设计师、系统规划与管理师。软考高级职称考什么好&#xff1f;有很多人是因为要评高级职称而选择参考软考高级资格考试&#xff0c;那么软考高级里哪个资…

16个值得推荐的.NET ORM框架

什么是ORM? ORM 是 Object Relational Mapping 的缩写&#xff0c;译为“对象关系映射”&#xff0c;是一种程序设计技术&#xff0c;用于实现面向对象编程语言里不同类型系统的数据之间的转换。它解决了对象和关系型数据库之间的数据交互问题&#xff0c;ORM的作用是在关系型…

txt2xml

import os import cv2 import pathlib from xml.dom.minidom import Document # 支持多种格式图片,可以自己添加 def search_file_name(file_path, img_root): file_format [.jpg, .JPG, .png, .PNG, .JPEG, .jpeg] file_path pathlib.Path(file_path) file_name…

数字化企业各业务模块模型

1.计划 1.1采购计划执行情况 序号 采购计划号 采购订单号 业务员 供应商 物料 数量 金额 计划入库日期 实际入库日期 状态 针对企业执行中或者未关闭的采购计划进行统计与分析&#xff0c;主要目的在于引领企业员工与领导关注长期在途的采购…

Android修行手册 - 可变参数中星号什么作用(冷知识)

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…