学习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;}
相关文章:
学习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>or…...
2024CSP-J模拟赛9————S12678
一,赛中得分 T1100T2100T350T440总分290 二,赛中概括 T1T2较快过,T3T4骗了90分(意料之中,这么好骗分!!!)。 三,题目解析 涂格子(paint) 问题描述 现在有…...
HarmonyOS中ArkUi框架中常用的装饰器
目录 1.装饰器 1)Component 1--装饰内容 2)Entry 1--装饰内容 2--使用说明 3)Preview 1--装饰内容 2--使用说明 4)CustomDialog 1--装饰内容 2--使用说明 5)Observed 1--装饰内容 2--使用说明 6)ObjectLin…...
服务攻防之Redis数据库安全
最近我将会把一些服务攻防方面的姿势在这里做一个简单总结。欢迎大家留言讨论。 首先我们先对这类安全问题做一个总体的概括! 一、总概 1.服务判断: 端口扫描:利用服务开启后的目标端口开放判断 组合判断:利用搭建常见组合分析可能开放服务…...
随机森林算法的原理与实现
随机森林(Random Forest)是一种集成学习算法,它通过构建多个决策树并结合这些树的结果来进行分类或回归。与单一的决策树相比,随机森林通过集成多个树的结果,能够显著提高预测的准确性和稳定性,减少模型的过…...
模仿百度-基础版
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>百度案例</title><style>*{margin: 0;p…...
c++贴瓷砖
题目描述 有一块大小是 2 * n 的墙面,现在需要用2种规格的瓷砖铺满,瓷砖规格分别是 2 * 1 和 2 * 2,请计算一共有多少种铺设的方法。 输入 输入的第一行包含一个正整数T(T<20),表示一共有T组数据&…...
用 Python 构建高级配对交易策略
作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本文阐述通过分析加密货币和传统金融工具之间的相关性和协整性,以及实施 Z-score 方法来生成交易信号,然后介绍如何使用 Python 构建配对交易策…...
Java 引用数据类型详解、字符串的不可变性、如何处理字符串的内存管理、String Pool 及其优化
文章目录 1. 引用数据类型1.1 常见引用数据类型 2. 字符串的不可变性2.1 不可变性的优点2.2 不可变性示例 3. 如何处理字符串的内存管理3.1 String Pool3.2 String 内存优化 4. String Pool 及其优化4.1 String Pool的工作原理4.2 String Pool的优化4.3 使用 intern() 进一步优…...
Babel使用
初始化项目 npm init -y 创建文件 // 转码前 // 定义数据 let input [1, 2, 3] // 将数组的每个元素 1 input input.map(item > item 1) console.log(input)配置.babelrc Babel的配置文件是.babelrc,presets字段设定转码规则,将es2015规则加入…...
自动机器学习(AutoML)
utoML是PAI的提供的自动寻找超参组合的机器学习增强型服务。您在训练模型时,如果超参组合复杂度过高,需大量训练资源和手工调试工作,可以使用AutoML来节省模型调参时间,提升模型调优效率和模型质量。 基础概念 超参数:…...
Vivado时序报告六:Report Timing详解
目录 一、前言 二、配置选项概览图 三、配置选项详解 3.1 Targets 3.2 Options 3.1.1 Report 3.1.2 Path limits 3.1.3 Path display 3.2 Advanced 3.2.1 Report 3.2.2 File Output 3.2.3 miscellaneous 3.3 Timer Settings 3.4 共有部分 四、 设计示例 4.1 设…...
java基础:数据类型的总结
一、Java 常用数据类型 1.数据类型分为:(1)基本数据类型 (2)引用数据类型 2.基本数据类型分类:数值型,非数值型。 3.数值型:(1) 整数类型(byte,short,int,long) (2) …...
【目标检测论文解读复现NO.39】基于改进 YOLOv8 的轻量级复杂环境苹果叶片病害检测方法
前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,…...
python 基础笔记 2(函数, 类)
起因, 目的: 把很久以前,自己写的笔记发布出来。 现在粉丝多了,也不觉得丢人了。 为什么这些序号不连贯,因为有些很熟悉的东西,我都删了。 内建函数, 函数 zip()函数,利用 * 号操作符,可以将元组解压为列表。 我怀疑是zip的解包只能用一次。在内存中解开一次之后就销…...
LeetCode 2090.半径为K的子数组平均值
题目: 给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k 。 半径为 k 的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值,即下标在 i - k 和 i k 范…...
Qt C++ 编程中定义了一个槽函数(slot)deleteLater的作用
这行代码是在 Qt C编程中定义了一个槽函数(slot)deleteLater。 在 Qt 框架中,Q_SLOTS关键字用于声明类中的槽函数。deleteLater是一个非常有用的函数,它会安排接收对象在事件循环返回后被删除。 通常在以下情况下会使用deleteLa…...
【Hive】8-Hive性能优化及Hive3新特性
Hive性能优化及Hive3新特性 Hive表设计优化 Hive查询基本原理 Hive的设计思想是通过元数据解析描述将HDFS上的文件映射成表 基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时,默认将其转换为分布式计算 MapReduce程序对HDFS中的数据进行…...
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18目录1. On the Reliability of Large Language Models to Misinformed and Demographically-Informed Prompts2. SafeLLM: Dom…...
CTF(四)
导言: 本文主要讲述在CTF竞赛中,web类题目file_include。 靶场链接:攻防世界 (xctf.org.cn) 一,观察页面。 可以看到一段php代码。从则段代码中我们可以知道: 1,使用include引入check.php文件ÿ…...
Blue-Topaz主题新手入门指南:打造你的个性化Obsidian笔记环境
Blue-Topaz主题新手入门指南:打造你的个性化Obsidian笔记环境 【免费下载链接】Blue-Topaz_Obsidian-css A blue theme for Obsidian. 项目地址: https://gitcode.com/gh_mirrors/bl/Blue-Topaz_Obsidian-css 还在为Obsidian默认界面单调而烦恼?…...
intv_ai_mk11可自主部署:脱离云API,数据不出内网的安全文本生成方案
intv_ai_mk11可自主部署:脱离云API,数据不出内网的安全文本生成方案 1. 产品概述 intv_ai_mk11是一款基于Llama架构的中等规模文本生成模型,专为需要数据安全性和本地化部署的企业用户设计。与依赖云API的解决方案不同,该模型完…...
Cadence IC618/Spectre231安装避坑指南:详解License配置、环境变量隔离与依赖检查
Cadence IC618/Spectre231深度配置实战:从环境隔离到长期稳定运行的进阶指南 在芯片设计领域,Cadence工具链的稳定运行直接关系到项目进度与设计质量。许多工程师在完成基础安装后,常会遇到许可证报错、环境冲突、工具崩溃等"疑难杂症&q…...
3秒完整保存:颠覆传统的Full Page Screen Capture网页截图新方案
3秒完整保存:颠覆传统的Full Page Screen Capture网页截图新方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-ch…...
告别NCM格式束缚:ncmdump让音乐自由流转全攻略
告别NCM格式束缚:ncmdump让音乐自由流转全攻略 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 一、问题场景:当音乐被"锁住"的三个真实故事 场景1:车载音…...
【C语言】-指针(1)
🦆 个人主页:深邃- ❄️专栏传送门:《C语言》《数据结构》 🌟Gitee仓库:《C语言》《数据结构》 目录内存和地址指针变量和地址指针变量和解引用操作符(*)指针变量的大小内存存放指针变量类型的…...
StructBERT中文句子匹配效果展示:AI客服对话中用户多轮提问语义连贯性分析
StructBERT中文句子匹配效果展示:AI客服对话中用户多轮提问语义连贯性分析 1. 项目背景与工具介绍 StructBERT中文句子相似度分析工具是基于阿里达摩院开源的先进预训练模型开发的本地化语义匹配解决方案。这个工具专门针对中文语言特点进行了深度优化,…...
Qwen3.5-9B实战教程:app.py添加流式输出支持+前端loading状态优化
Qwen3.5-9B实战教程:app.py添加流式输出支持前端loading状态优化 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,具备强大的逻辑推理、代码生成和多轮对话能力。该模型支持多模态理解(图文输入)和长上下文处理&…...
OpenClaw二次开发入门:Phi-3-mini-128k-instruct模型适配改造
OpenClaw二次开发入门:Phi-3-mini-128k-instruct模型适配改造 1. 为什么需要自定义模型适配 去年我在尝试用OpenClaw自动化处理技术文档时,发现官方支持的模型在长文本生成任务上表现不稳定。当时手头正好有Phi-3-mini-128k-instruct的部署实例&#x…...
实战:多语言翻译协作 Agent Harness
实战:多语言翻译协作 Agent Harness 1. 标题 (Title) 从零构建多语言翻译协作系统:Agent Harness 实战指南 多 Agent 协作新范式:打造智能多语言翻译 Harness 框架 告别单一翻译模型:构建协作式多语言翻译 Agent 系统 Agent Harness 实战:如何让多个 AI 代理协同完成专业…...
