如何实现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.hqwc.cn/news/175085.html

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

相关文章

Mozilla 面向基于 Debian 的 Linux 发行版

导读Mozilla 公司今天发布新闻稿&#xff0c;表示面向 Debian、Ubuntu 和 Linux Mint 等基于 Debian 的发行版&#xff0c;推出了.deb 格式的 Firefox Nightly 浏览器安装包&#xff0c;便于用户在上述发行版中更轻松地安装。 本次更新的亮点之一在于采用 APT 存储库&#xff0…

think5和fastadmin验证规则的使用

在fastadmin中使用验证规则只需要两步即可 第一步 首先在控制器中开启验证规则 protected $modelValidatetrue;//开启验证规则protected $modelSceneValidatetrue;//开启场景验证第二步 在 app\admin\validate 和控制器对应的 validate 中添加 验证规则以及场景验证 <?…

Winform / WPF 自定义控件 —— IPV4 地址输入框

在开始阅读本文之前&#xff0c;如果您有学习创建自定义控件库并在其他项目中引用的需求&#xff0c;请参考&#xff1a;在Visual Studio中创建自定义Winform控件库并在其他解决方案中引用https://blog.csdn.net/YMGogre/article/details/126508042 0、引言 Winform / WPF 框架…

Java主流分布式解决方案多场景设计与实战

Java的主流分布式解决方案的设计和实战涉及到多个场景&#xff0c;包括但不限于以下几点&#xff1a; 分布式缓存&#xff1a;在Java的分布式系统中&#xff0c;缓存是非常重要的一部分。常用的分布式缓存技术包括Redis、EhCache等。这些缓存技术可以用来提高系统的性能和响应…

Spark通过三种方式创建DataFrame

通过toDF方法创建DataFrame 通过toDF的方法创建 集合rdd中元素类型是样例类的时候&#xff0c;转成DataFrame之后列名默认是属性名集合rdd中元素类型是元组的时候&#xff0c;转成DataFrame之后列名默认就是_N集合rdd中元素类型是元组/样例类的时候&#xff0c;转成DataFrame…

uniapp+vite+vue3开发跨平台app,运行到安卓模拟器调试方法

因为没有使用hbuilder开发uniapp&#xff0c;而是使用了vscode和vite来开发的&#xff0c;所以怎么将这个程序运行到安卓模拟器调试开发呢&#xff1f;其实方法很简单&#xff0c;使用android studio创建一个模拟器或者其他mumu模拟器&#xff0c;然后将项目使用hbuilder打开&a…

246:vue+openlayers 绘制多边形,drawend获取最大幅宽

第246个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中绘制多边形,drawend获取最大幅宽。这里利用turf的turf.distance和openlayers的getExtent获取坐标值。 距离赤道越近,幅宽会越大一些,这里面利用了Math.abs来做绝对值的判断处理。 直接复制下面的 vue+open…

jupyter lab配置列表清单

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Karmada调度器

调度器就像一个发动机&#xff0c;如果没有了发动机输入动力&#xff0c;是无法正常运行的。就像 Kubernetes 的调度器&#xff0c;它会负责根据节点的资源状态、Pod 的运行状态&#xff0c;判断 Pod 是调度到怎样的集群节点上去。对于 Karmada 这样的多云能力的调度器来说&…

Zabbix 5.0部署(centos7+server+MySQL+Apache)

环境 系统IPZABBIX版本主机名centos7192.168.231.2195.0zabbix-server 安装zabbix 我选择版本是zabbix-5.0 zabbix的官网是Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution 安装Zabbix软件源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/…

Unity--互动组件(Toggle)

1.组件的可交互 2.组件的过渡状态 3.组件的导航 4.Toggle的属性和参数设置 Toggle 切换控制是一个复选框&#xff0c;允许用户打开或关闭的一个选项&#xff1b; ”Toggle的属性和参数&#xff1a;“” Is on&#xff1a;&#xff08;开启&#xff09; 拨动开关是否从一开…

如何将微软 Office 宏转换为 ONLYOFFICE 宏

想要将微软 Office VBA 宏转换为可在 ONLYOFFICE 中无缝使用的宏&#xff1f;嗯&#xff0c;虽然这种需求并没有直接的解决方案&#xff0c;不过我们也会在本文中介绍 VBA 宏的转换步骤——正好我们手上也有一个来自用户的实际案例可供参考。 VBA 宏 以下是原始的 VBA 宏代码&…