SpringBoot整合分布式锁redisson

news/2024/5/17 12:42:04/文章来源:https://blog.csdn.net/weixin_55127182/article/details/129125249

1、导入maven坐标

<!-- 用redisson作为所有分布式锁,分布式对象等功能框架--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.5</version></dependency>

2、redisson配置类(如果redis没有密码就不需要private String password)

package com.xuechengpluscommon.config;import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @description Redisson 配置类*/
@Configuration
public class MyRedissonConfig {@Value(value = "${spring.redis.host}")private String host;@Value(value = "${spring.redis.port}")private int port;@Value(value = "${spring.redis.database}")private int database;
//    @Value(value = "${spring.redis.password}")
//    private String password;/*** 单Redis节点模式配置方法* 其他配置參數,看:* <a href = "https://github.com/redisson/redisson/wiki/2.-%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95#26-%E5%8D%95redis%E8%8A%82%E7%82%B9%E6%A8%A1%E5%BC%8F">* 单Redis节点模式配置方法* </a>** @return {@link RedissonClient}*/@Bean(destroyMethod = "shutdown")RedissonClient redisson() {Config config = new Config();//Redis多节点// config.useClusterServers()//     .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:7001");//Redis单节点SingleServerConfig singleServerConfig = config.useSingleServer();//可以用"rediss://"来启用SSL连接String address = "redis://" + host + ":" + port;singleServerConfig.setAddress(address);//设置 数据库编号singleServerConfig.setDatabase(database);
//        singleServerConfig.setPassword(password);//连接池大小:默认值:64// singleServerConfig.setConnectionPoolSize()return Redisson.create(config);}}

yml中redis的配置

redis:database: 0host: ip地址port: 6379

3、创建redisson的bean

@Autowired
private RedissonClient redisson;

4、测试,入队

@Test
void contextLoads1() {RQueue<String> queue = redisson.getQueue("RedissonQueue");queue.add("hello");System.out.println(queue);
}

redis数据

5、测试,出队

@Test
void contextLoads2() {RQueue<String> queue = redisson.getQueue("RedissonQueue");String remove = queue.remove();System.out.println(remove);
}

出队数据:

6、分布式锁

public R redisTest1() throws InterruptedException {//首先从redis查询数据Orders redisOrder;redisOrder=(Orders) redisTemplate.opsForValue().get("redisTest");//如果存在redis则返回if(ObjectUtils.isNotEmpty(redisOrder)){return R.ok(redisOrder);//如果不存在则从数据库查询}else {//首先获取分布式锁RLock lock = redissonClient.getLock("redisTestDogWatch");//上锁lock.lock();//获取锁之后进行查询try {redisOrder = (Orders) redisTemplate.opsForValue().get("redisTest");if (ObjectUtils.isNotEmpty(redisOrder)) {return R.ok(redisOrder);}//数据库查询redisOrder= ordersService.getById(1577177773194113014L);redisTemplate.opsForValue().set("redisTest", redisOrder );System.out.println("[从数据库中查询]");} catch (Exception e) {e.printStackTrace();} finally {//删除锁lock.unlock();}return R.ok(redisOrder);}}

在这里让线程睡眠35秒

//上锁
lock.lock();
Thread.sleep(35000);

此时三个服务器运行

测试结果

可以首先看到已经上锁的redisTestDogWatch,每个锁30秒,如果线程未完成则会自动续30秒,如果线程完成到finally中的unlock就删除锁

目前可以看到只有一个服务器获取到锁

存储redis的数据

此时进行并发测试

依旧保持35秒的睡眠时间

此时可以看到未拿到锁的线程报错

java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: d904f2b9-e75d-472d-a5a6-d0a8cc603a80 thread-id: 210

尝试解锁锁定,未被当前线程锁定 按节点 ID:C731FAC4-9BF7-4F4A-ACC1-A2CC9B78A02F 线程 ID:232

这是因为锁住了,所以无法获取锁,然后看门狗会不断刷新

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

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

相关文章

Kafka第三章:新旧节点更替

系列文章目录 Kafka第一章&#xff1a;环境搭建 Kafka第二章&#xff1a;生产者案例 Kafka第三章&#xff1a;新旧节点更替 文章目录系列文章目录前言一、创建新节点1.克隆节点2.修改Kafka配置二、添加新节点1.启动集群2.启动105的Kafka3.创建一个要均衡的主题4.生成一个负载均…

C++项目——高并发内存池(1)--介绍及定长内存池

1.什么是内存池 1.1 池化技术 将程序中需要经常使用的核心资源先申请出来&#xff0c;放在一个池内&#xff0c;由程序自己管理&#xff0c;这样可以提高资源的使用效率&#xff0c;也可以保证本程序占有的资源数量。 比如之前博文实现的线程池&#xff0c;就是预先的申请出…

第四次作业

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept)学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键课程表&#xff1a;Course (Cno, Cname)课程号&#xff0c;课程名 Cno为主键学生选课表&#xff1a;SC (Sno, Cno, Score)学号&…

面试经常被问悲观锁和乐观锁?什么是cas?来我花3分钟时间告诉你

锁大家都知道吧&#xff0c;多线程访问资源会存在竞争&#xff0c;那么就需要加锁进而让多个线程一个一个访问。 比如有一个房间&#xff0c;一次只能进一个人&#xff0c;现在有十个人都想进去怎么办&#xff1f; 对&#xff0c;加锁。拿一把钥匙&#xff0c;谁抢到钥匙谁就…

微服务 ModuleFederationPlugin Vue项目体验

随着公司项目的模块越来越多&#xff0c;每次打包后的项目都非常大&#xff0c;而且每修改一个小的模块&#xff0c;都会将整个项目打包&#xff0c;会非常的麻烦&#xff0c;随着前端的发展&#xff0c;微服务的出现&#xff0c;很好的解决了项目庞大的问题&#xff0c;而且每…

大数据处理学习笔记1.4 掌握Scala运算符

文章目录零、本讲学习目标一、运算符等价于方法&#xff08;一&#xff09;运算符即方法&#xff08;二&#xff09;方法即运算符1、单参方法2、多参方法3、无参方法二、Scala运算符&#xff08;一&#xff09;运算符分类表&#xff08;二&#xff09;Scala与Java运算符比较三、…

I.MX6ULL_Linux_系统篇(17) uboot分析-启动linux

bootz 启动 Linux 内核 images 全局变量 不管是 bootz 还是 bootm 命令&#xff0c;在启动 Linux 内核的时候都会用到一个重要的全局变量&#xff1a;images&#xff0c; images 在文件 cmd/bootm.c 中有如下定义&#xff1a; images 是 bootm_headers_t 类型的全局变量&…

03- 通过OpenCV进行图像变换 (OpenCV基础) (机器视觉)

知识重点 resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) 图像的放大与缩小, 变形 flip(src, flipCode) 图像的翻转 rotate(img, rotateCode) 图像的旋转 warpAffine(src, M, dsize, flags, mode, value) 仿射变换是图像旋转, 缩放, 平移的总称.具体的做法是通…

Windows10神州网信政府版麦克风、摄像头的使用

Windows10神州网信政府版默认麦克风摄像头是禁用状态&#xff0c;此禁用状态符合版本规定。 在录课和直播过程中&#xff0c;如果需要使用麦克风和摄像头的功能&#xff0c;可以这样更改&#xff1a; 1、鼠标右键点击屏幕左下角的开始菜单图标&#xff0c;选择windows中的“运…

跨时钟域 单脉冲 脉冲信号同步问题——快到慢(1)

引言 FPGA设计或者ASIC设计中经常存在多个时钟域&#xff0c;那么这些时钟域之间脉冲信号的同步该如何进行设计&#xff1f;快时钟域到慢时钟域的脉冲信号同步与慢时钟域信号到快时钟域信号的同步是不一样的。 本文先给出快时钟域到慢时钟域脉冲信号同步的方法之一&#xff…

C++设计模式(17)——备忘录模式

亦称&#xff1a; 快照、Snapshot、Memento 意图 备忘录模式是一种行为设计模式&#xff0c; 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 问题 假如你正在开发一款文字编辑器应用程序。 除了简单的文字编辑功能外&#xff0c; 编辑器中还要有设置文本格…

覃小龙34岁生日记:结合趋势,发挥优势,方能百战不殆

覃小龙34岁生日记:结合趋势&#xff0c;发挥优势&#xff0c;方能百战不殆&#xff01;2023-2-20星期一 覃小龙2023年2月17日&#xff0c;是我34岁生日&#xff0c;1989年出生的我&#xff0c;一晃眼&#xff0c;已经走过第34个年头了&#xff01;从2016年创业到今天&#xff0…

【Spark分布式内存计算框架——Spark SQL】13. 自定义UDF函数

第七章 自定义UDF函数 无论Hive还是SparkSQL分析处理数据时&#xff0c;往往需要使用函数&#xff0c;SparkSQL模块本身自带很多实现公共功能的函数&#xff0c;在org.apache.spark.sql.functions中。SparkSQL与Hive一样支持定义函数&#xff1a;UDF和UDAF&#xff0c;尤其是U…

C++进阶:二叉搜索树

文章目录1 二叉搜索树概念2 二叉搜索树的实现2.1 结点的定义2.2 二叉搜索树的插入2.2 二叉搜索树的查找2.3 二叉搜索树的删除2.4 二叉搜索树的默认成员函数2.4.1 拷贝构造2.4.2 析构函数2.4.3 赋值重载3 二叉搜索树的应用3.1 k模型3.2 kv模型4 二叉搜索树的性能分析1 二叉搜索树…

Nacos注册中心和配置中心使用详情

Nacos Nacos就是Alibaba推出的一款 配置中心和注册中心结合的一款工具&#xff0c;属于SpringCloudAlibaba技术栈下 Nacos官网地址 https://nacos.io/zh-cn/index.html 安装启动 下载 目录结构 根据目录结构可以看出Nacos本身也就是一个java程序。SpringBoot程序 启动 c…

配置Tomcat性能优化

配置Tomcat性能优化 &#x1f4d2;博客主页&#xff1a; 微笑的段嘉许博客主页 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f4…

【Python网络编程】利用Python进行TCP、UDP套接字编程

之前实现了Java版本的TCP和UDP套接字编程的例子&#xff0c;于是决定结合Python的学习做一个Python版本的套接字编程实验。 流程如下&#xff1a; 1.一台客户机从其标准输入&#xff08;键盘&#xff09;读入一行字符&#xff0c;并通过其套接字将该行发送到服务器。 2.服务…

基于springboot+vue的校园社团管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

基于 DSP+FPGA 的高清图像跟踪系统研制

目标识别与跟踪技术是目前图像处理研究的重点方向&#xff0c;在军事和民用领域中 具有广泛的应用价值&#xff0c;如精确制导武器、导弹飞机预警等军事领域&#xff0c;如交通管理、 刑事侦查等民用领域。其中&#xff0c;如何在复杂的背景中&#xff0c;提取、识别与跟踪特定…

(考研湖科大教书匠计算机网络)第五章传输层-第八节2:TCP连接管理实践部分

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 此部分为补充内容&#xff0c;主要使用Java实现TCP和UDP通信 一&#xff1a;UDP通信 &#xff08;1&#xff09;Java数据报套接字通信模型 Java UDP通信模型&#xff…