学习Redisson实现分布式锁

官网:https://redisson.org/

官方文档:https://redisson.org/docs/getting-started/

官方中文文档:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95

1、引入依赖

<!--redisson-->
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version>
</dependency>

如果用下面这个依赖,后面则省去config这一步配置过程,如果用上面后面config则要配置

<!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.27.2</version>
</dependency>

2、配置Redisson客户端

(1)程序化配置方法

参考官网:

@Configuration
public class RedissonConfig {@Beanpublic RedissonClient redissonClient(){// 配置Config config = new Config();// 如果是集群使用config.useClusterServers().setAddress()config.useSingleServer().setAddress("redis://192.168.75.101:6379").setPassword("123321");// 创建RedissonClient对象return Redisson.create(config);}
}
(2)文件方式配置

当然也可以如果yml的方式进行配置,参考官方文档如下:https://github.com/redisson/redisson/wiki/2.-%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95#22-%E6%96%87%E4%BB%B6%E6%96%B9%E5%BC%8F%E9%85%8D%E7%BD%AE

还有一些配置详细信息:

 这里我们使用程序化配置方式 !

3、简单使用Redisson的分布式锁

这里讲可重入锁

 参考:8. 分布式锁和同步器 · redisson/redisson Wiki · GitHub

@Resource
private RedissionClient redissonClient;@Test
void testRedisson() throws Exception{//获取锁(可重入),指定锁的名称RLock lock = redissonClient.getLock("myLock");//尝试获取锁,参数分别是:获取锁的最大等待时间(期间会重试),锁自动释放时间,时间单位boolean isLock = lock.tryLock(1,10,TimeUnit.SECONDS);//判断获取锁成功if(isLock){try{System.out.println("执行业务");          }finally{//释放锁lock.unlock();}}       
}

Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟

剩余其余锁可以参考官方文档。

4、分布式锁原理

Redisson分布式锁原理:

可重入:利用hash结构记录线程id和重入次数

可重试:利用信号量和PubSub功能实现等待、唤醒,获取锁失败的重试机制

超时续约:利用watchDog机制,开启一个定时任务,每隔一段时间(releaseTime / 3),重置超时时间

5、实战

在微信登录操作的时候加上分布式锁

首先需要:

@Resource
private RedissonClient redissonClient;
/*** 微信登录*/@Overridepublic User wxLogin(UserLoginDTO userLoginDTO) {//调用微信接口服务,获得当前微信用户的openidString openid = getOpenid(userLoginDTO.getCode());System.out.println("当前微信用户的openid"+openid);//判断openid是否为空,如果为空表示登录失败,抛出业务异常if (openid==null){throw new LoginFailedException(MessageConstant.LOGIN_FAILED);}//判断当前用户是否为新用户
//        User user = userMapper.getByOpenid(openid);QueryWrapper<User>wrapper=new QueryWrapper<>();wrapper.lambda().eq(User::getOpenid,openid);User user = userMapper.selectOne(wrapper);//如果为新用户,自动完成注册if (user==null){RLock lock = redissonClient.getLock(RedissonConstant.LOCK_USER_REGISTER_KEY + openid);if (!lock.tryLock()){throw new RegisterFailedException(MessageConstant.REGISTER_FAILED_USER_EXIST);}try {//获得当前用户表数据数量Long allUserNums = userMapper.selectCount(null);//构造用户编号id/*"%0" + 8 + "d":这是一个格式字符串,用于指定输出格式。"%0" 表示输出时,如果数字的长度不足指定的宽度,则在前面补0;8 是紧接着 %0 后面的数字,表示输出的数字至少要有8位;"d" 表示输出的是十进制整数。因此,整个格式字符串意味着输出一个至少8位的十进制整数,如果不足8位,则在前面补0*/String substring = String.valueOf(System.currentTimeMillis()).substring(5);String quickUserId = "QUICK" +substring+"_"+ String.format("%0" + 6 + "d", allUserNums + 1);log.info("注册新用户");user=User.builder().openid(openid).quickUserId(quickUserId).wallet(0L).follow(0L).fan(0L).briefIntroduction("").collectNumber(0L).markNumber(0L).useTime(0L).name("微信用户").phone("").sex("").avatar("https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0").createTime(LocalDateTime.now()).build();userMapper.insert(user);//发送mq异步消息修改es表 发送这两个数据后续获取用户信息 openidtry {rabbitTemplate.convertAndSend(EsUserDocListener.ADD_USER_DOC_EXCHANGE_NAME,EsUserDocListener.ADD_USER_DOC_ROUTING_KEY,user.getQuickUserId());} catch (AmqpException e) {log.error("发送新增userDoc消息失败", e);}}catch (DuplicateKeyException e){throw new RegisterFailedException(MessageConstant.REGISTER_FAILED_USER_EXIST);}finally {// 解锁lock.unlock();}}//返回这个用户的对象return user;}

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

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

相关文章

金融大数据平台总体技术

目录 金融大数据平台应用场景风险管理 场景描述解决方案​​​​​​​市场营销 ​​​​​​​场景描述解决方案​​​​​​​金融大数据信息价值链​​​​​​​金融大数据平台总体目标金融大数据平台功能技术要求​​​​​​​ ​​​​​​​概述数据接入功能要求 ​​…

Git 根据远程分支拉取并创建本地分支

文章目录 1 关联远程仓库2 获取最新更改&#xff0c;并创建分支3 clone时直接指定远程分支 1 关联远程仓库 git remote add remote_repo ssh:git***.git2 获取最新更改&#xff0c;并创建分支 查看本地分支和远程分支 git branch -a获取最新更改 git fetch remote_repo根据…

创建读取比特币1P类型地址

创建读取比特币1P类型地址 比特币的地址类型有多种&#xff0c;其中 P2TR&#xff08;Pay-to-Taproot&#xff09;地址是基于最近的升级&#xff08;Taproot&#xff09;引入的一个新类型。本文将介绍如何创建和读取比特币的 1P 类型地址&#xff0c;主要通过 JavaScript 和相…

谁在窥探我们的网络数据?——在未经许可下获取用户上网数据的情形与维权指南

在数字化时代&#xff0c;网络数据不仅是商业价值的金矿&#xff0c;更是用户隐私的敏感部分。然而&#xff0c;有时用户的上网数据可能会在未经知情与允许的情况下被收集甚至滥用。这篇文章将详细探讨哪些机构在何种情况下可以合法获取用户上网数据、用户如何通过法律手段维护…

吐槽kotlin之垃圾设计

本文重点在于吐槽垃圾设计&#xff0c;基本直只说缺点。 一.没有static关键字 static其实不是很面向对象&#xff0c;但是是很有必要和方便的。 kotlin为了实现java的static功能&#xff0c;必须使用伴生类&#xff0c;一般情况下没啥问题&#xff0c;但是反编译之后的class多…

ES6字符串 全局替换

字符串替换 部分替换replace 全部替换 replaceAll aabbcc.replace(b, _) // aa_bcc如果要替换所有的匹配&#xff0c;不得不使用正则表达式的g修饰符。 aabbcc.replace(/b/g, _) // aa__cc

Github学生包的JetBrains认证过期/idea认证过期如何解决?

官网通过Github更新状态即可JetBrains Account 注意要到邮箱走流程

C++面试速通宝典——26

478. 你了解的网络攻击方式有哪些&#xff1f;SYN攻击的防范方法&#xff1f; 网络攻击方式包括&#xff1a; Dos/DDos攻击&#xff1a;通过大量请求耗尽目标资源。Main-in-the-Middle攻击&#xff1a;攻击者拦截和篡改双方通信。Phishing&#xff1a;通过假冒网站或通信骗取…

SQL Server LocalDB 表数据中文乱码问题

--查看数据库设置 SELECT name, collation_name FROM sys.databases;--出现了The database could not be exclusively locked to perform the operation这个错误&#xff0c; --无法修改字符集为Chinese_PRC_CI_AS&#xff1b;所以需要先设置为单用户模式 ALTER DATABASE MySma…

初试PostgreSQL数据库

文章目录 一、PostgreSQL数据库概述1.1 PostgreSQL的历史1.2 PostgreSQL安装1.3 安装PostgreSQL二、PostgreSQL起步2.1 连接数据库2.1.1 SQL Shell2.1.2 执行SQL语句2.2 pgAdmin 42.2.1 打开pgAdmin 42.2.2 查找数据库2.2.3 打开查询工具2.2.4 执行SQL语句三、实战小结文章目录…

日本AZBIL山武燃烧控制器AUR450C42350D0

顺序定时 (在室温、湿度和额定电压下)火焰电压输出范围火焰电压范围 (在额定电压、室温和湿度下)推荐火焰电压额定电源电压允许电压范围功耗介电强度页序&#xff0c;如果发生火修非循环操作629279484士1秒&#xff0c;8士2秒可根据型号选择)仅限《行员7.52.5秒主要审判73秒火老…

大一计算机课程之线性代数

《大一计算机课程之线性代数》 在大一的计算机课程中&#xff0c;线性代数是一门极为重要的基础学科&#xff0c;它就像一把神奇的钥匙&#xff0c;为计算机科学领域的诸多方面开启了智慧之门。 线性代数主要研究线性方程组、向量空间、线性变换等内容。对于计算机专业的学生…

主动降噪技术:原理、方法与应用的深度解析

目录 一、主动降噪的原理二、主动降噪的技术分类三、主动降噪中的核心算法四、主动降噪的应用领域五、主动降噪技术的挑战与未来发展六、结论 主动降噪&#xff08;Active Noise Cancellation&#xff0c;ANC&#xff09;是当前音频技术中的重要应用&#xff0c;广泛用于耳机、…

HCIP-HarmonyOS Application Developer 习题(九)

(多选) 1、HarmonyOS多窗口交互能力提供了以下哪几种交互方式&#xff1f; A. 全局消息通知 B.平行视界 C.悬浮窗 D.分屏 答案&#xff1a;BCD 分析&#xff1a;系统提供了悬浮窗、分屏、平行视界三种多窗口交互&#xff0c;为用户在大屏幕设备上的多任务并行、便捷的临时任务…

【已解决】黑群晖绕过双重认证(2FA)登录(终极方案)

黑群晖绕过双重认证&#xff08;2FA&#xff09;登录&#xff08;终极方案&#xff09; 黑裙版本7.x&#xff0c;之前设置了双重认证&#xff0c;但是由于更换设备导致卡在2FA登录界面&#xff0c;无法登录&#xff0c;之前也没开SSH&#xff0c;网上找了很多方法&#xff0c;…

LeetCode322:零钱兑换

题目链接&#xff1a;322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 代码如下 class Solution { public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount 1, INT_MAX);dp[0] 0;for(int i 0; i < coins.size(); i){fo…

程序员必读:精通ER图设计,解锁数据库高效构建秘籍

在信息技术的浩瀚星空中&#xff0c;数据库如同星辰般璀璨&#xff0c;而ER图&#xff08;Entity-Relationship Diagram&#xff0c;实体-关系图&#xff09;则是那把引领我们穿越数据迷雾的钥匙。对于每一位程序员而言&#xff0c;掌握ER图设计不仅是数据库设计的基础&#xf…

Flutter 3.24 发布:GPU模块及多视图嵌入功能

Flutter 3.24 发布&#xff1a;GPU模块及多视图嵌入功能 Flutter 3.24 带来了许多新功能和改进&#xff0c;让开发应用程序变得更加容易和有趣。这个版本重点展示了 Flutter GPU 的预览功能&#xff0c;让应用程序可以直接使用高级图形和 3D 场景功能。 此外&#xff0c;网页…

从零开始,如何构建一个完整的Java Web应用(全面指南!)

第一步&#xff1a;设置开发环境 1. 安装必要的软件 2. 创建项目结构 3. 添加Spring Boot依赖 4. 配置数据库连接 第二步&#xff1a;设计数据模型 1. 创建实体类 2. 创建Repository接口 第三步&#xff1a;创建服务层 1. 创建服务接口 2. 实现服务接口 第四步&…

Open WebUI | 自托管的类 ChatGPT 网站

Open WebUI 是一个扩展性强、功能丰富且用户友好的自托管 WebUI&#xff0c;支持 ChatGPT 网页端的大部分功能&#xff0c;支持各类模型服务&#xff0c;包括 Ollama 和 OpenAI 的 API。该项目在 GitHub 上已有 38k 星&#xff0c;非常受欢迎。 功能介绍 本篇介绍该项目的功能…