Redisson 分布式锁可重入的原理
目录
1. 使用 Redis 实现分布式锁存在的问题
2. Redisson 的分布式锁解决不可重入问题的原理
1. 使用 Redis 实现分布式锁存在的问题
- 不可重入:同一个线程无法两次 / 多次获取锁
- 举例
- method1 执行需要获取锁
- method2 执行也需要(同一把)锁
- 如果 method1 中调用了 method2,就会出现死锁的情况
- method1 执行的过程是同一个线程,但是锁无法识别,则无法重入
2. Redisson 的分布式锁解决不可重入问题的原理
- 原理
- 判断是否可重入:记录占有锁的当前线程和想要获取锁的线程是否是同一个线程,如果是则获取锁成功
- 获取锁
- 判断锁是否是自己的
- 在 hash 的 value 中记录锁总共被(同一线程)获取的次数,获取一次,value + 1,且要重置锁的有效期,给重入的方法执行预留充足时间
- 释放锁:判断锁的重入次数(即 value)是否为 0
- 如果为 0,说明重入锁的层数到了最外层(method1),可以执行释放锁的逻辑
- 如果 value > 0,说明还没有到最外层(还在执行 method2),则不能释放锁,而是将 value - 1,表示跳到外面一层,且需要重置锁的有效期
- 核心思想:利用 Redis 中的 hash 结构,记录获取锁的线程和重入次数

- 获取锁和释放锁的原子性:Lua 脚本
相关文章:
Redisson 分布式锁可重入的原理
目录 1. 使用 Redis 实现分布式锁存在的问题 2. Redisson 的分布式锁解决不可重入问题的原理 1. 使用 Redis 实现分布式锁存在的问题 不可重入:同一个线程无法两次 / 多次获取锁举例 method1 执行需要获取锁method2 执行也需要(同一把)锁如…...
【Vue实用功能】Vue实现文档在线预览功能,在线预览PDF、Word等office文件
1、Office Web(微软的开发接口) 优点 没有 Office也可以直接查看Office 文件适用于移动端、PC无需下载文件就可以在浏览器中查看 <iframe src"文档地址" frameborder"0" /> const docUrl 外网可预览的地址 const url encodeURIComponent(docUrl…...
【一站解决您的问题】mac 利用命令升级nodejs、npm、安装Nodejs的多版本管理器n、nodejs下载地址
一:下载nodejs 官网地址,点击下载稳定版 https://nodejs.org/en 如果官网下载特别慢,可以点击这个地址下载 点击这里 https://nodejs.cn/download/current/ 安装完成后,就包含了nodejs 和 npm。此时您的版本就是下载安装的版本…...
【RabbitMQ】死信(延迟队列)的使用
目录 一、介绍 1、什么是死信队列(延迟队列) 2、应用场景 3、死信队列(延迟队列)的使用 4、死信消息来源 二、案例实践 1、案例一 2、案例二(消息接收确认 ) 3、总结 一、介绍 1、什么是死信队列(延迟队列) 死信,在官网中对应的单词…...
java 解析word模板(2024-01-25)
本文主要功能是解析word模板 这是一个word解析类,因为我做的系统用到了而且没有可用的帮助类,只能自己写。之前的实现方式是freemarker 模板解析。但是这次要求用poi不在使用freemarker。实现功能比较少,主要是满足开发需求即可,没…...
flutter-相关个人记录
1、flutter 安卓打包打包报错 flutter build apk -v --no-tree-shake-icons 2、获取华为指纹证书命令 keytool -list -v -keystore ***.jks 3、IOS项目中私有方法查找隐藏文件中 1、cd 项目目录地址 2、grep -r xerbla. "xerbla"为需要查找的关键字 3…...
互斥锁/读写锁(Linux)
一、互斥锁 临界资源概念: 不能同时访问的资源,比如写文件,只能由一个线程写,同时写会写乱。 比如外设打印机,打印的时候只能由一个程序使用。 外设基本上都是不能共享的资源。 生活中比如卫生间,同一…...
Jackson序列化Bean额外属性附加--@JsonAnyGetter、@JsonUnwrapped用户
1. 场景 有一项工作,需要将数据从一个服务S中读取出来(得到的是一个JSON),将数据解析转换以后构造成一个数组的类型A的对象,写入到一个服务T中。 A.class Data public class A {String f0 ;String f1 ; }在发现需要…...
排序算法——冒泡排序算法详解
冒泡排序算法详解 1.引言2.算法概览2.1输入处理2.2核心算法步骤2.3数据结构2.4复杂度分析 3.算法优化4.边界条件和异常处理5.实验和测试6.应用和扩展7.代码示例8.总结 1.引言 冒泡排序是一种简单而直观的比较排序算法,它通过多次遍历数组,比较相邻元素并…...
宋仕强论道之华强北的缺货潮(十六)
始于2019年缺货潮让华强北又生产一大批亿万富翁,缺货的原因主要是:首先,疫情封控导致大量白领在家远程办公,需要购买电脑、打印机等办公设备,同时孩子们也要在家上网课,进一步增加对电子智能终端产品的需求…...
登录注册页面
前提:基于element-ui环境 模态登录组件 分析Login.vue <template><div class"login"><span click"handleClose">X</span></div> </template><script> export default {name: "Login",m…...
视频美颜SDK详解:动态贴纸技术的前沿探索
当下,美颜SDK的动态贴纸技术作为视频美颜的独特亮点,吸引了越来越多开发者和用户的关注。 一、技术详解 动态贴纸技术是视频美颜SDK中的一项创新性功能,它通过在实时视频中添加各种动态效果,为用户提供更加生动有趣的拍摄体验。…...
vue3 实现上传图片裁剪
在线的例子以及代码,请点击访问链接...
flink1.18 广播流 The Broadcast State Pattern 官方案例scala版本
对应官网 https://nightlies.apache.org/flink/flink-docs-master/docs/dev/datastream/fault-tolerance/broadcast_state/ 测试数据 * 广播流 官方案例 scala版本* 广播状态* https://nightlies.apache.org/flink/flink-docs-master/docs/dev/datastream/fault-tolerance…...
vueRouter中scrollBehavior实现滚动固定位置
使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。 注意: 这个功能只在 HTML5 h…...
解决WinForms跨线程操作控件的问题
解决WinForms跨线程操作控件的问题 介绍 在构建Windows窗体应用程序时,我们通常会遇到需要从非UI线程更新UI元素的场景。由于WinForms控件并不是线程安全的,直接这样做会抛出一个异常:“控件’control name’是从其他线程创建的,…...
从零开始:Git 上传与使用指南
Git 是一种非常强大的版本控制系统,它可以帮助您在多人协作开发项目中更好地管理代码版本,并确保每个团队成员都能及时地获取最新的代码更改。在使用 Git 进行版本控制之前,您需要先进行一些设置,以确保您的代码能够顺利地与远程仓…...
Docker compose部署Golang服务
Docker Compose 部署 在使用docker部署时,除了使用--link的方式来关联容器之外,还可以使用 docker compose 运行多个容器。 本文以项目:https://github.com/johncxf/go-api 为例。 定义 Dockerfile 我这里用于区分默认 Dockerfile 文件&a…...
Day36 435无重叠区间 763划分字母区间
435 无重叠区间 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 本题与上一题类似: 如果按照左…...
【Servlet】如何编写第一个Servlet程序
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得,欢迎大家在评论区交流讨论💌 Servlet是Java编写的服务器端…...
BilibiliDown高效使用指南:解决20个核心功能难题
BilibiliDown高效使用指南:解决20个核心功能难题 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bil…...
HY-MT1.5-1.8B保姆级部署指南:在4090D上快速搭建多语言翻译服务
HY-MT1.5-1.8B保姆级部署指南:在4090D上快速搭建多语言翻译服务 1. 引言 你是否遇到过这样的场景:需要快速翻译大量文档,但担心隐私泄露不敢使用在线服务?或者开发智能硬件产品时,需要内置高质量的离线翻译功能&…...
OpenClaw极简开发:用nanobot镜像快速验证自动化脚本
OpenClaw极简开发:用nanobot镜像快速验证自动化脚本 1. 为什么选择nanobot镜像进行OpenClaw开发 作为一名长期在本地折腾AI自动化脚本的开发者,我深知环境配置的痛。每次换机器重装OpenClaw,总要在Node.js版本、Python依赖和模型部署之间反…...
变压器匝间短路这玩意儿仿真起来是真刺激。今儿拿COMSOL折腾了个5%短路模型,从电磁场到噪声一条龙全流程,咱们边撸代码边唠嗑
comsol仿真,变压器匝间短路5%的电磁振动噪声模型 包括电磁场分布,磁密分布,振动形变,噪声分布等结果建模第一步得先让线圈支棱起来。在组件里用参数化曲线画线圈特别实用: # 参数化螺旋线 r 0.5 # 半径(m) pitch 0.…...
通义千问2.5-7B-Instruct开发者指南:API调用代码实例详解
通义千问2.5-7B-Instruct开发者指南:API调用代码实例详解 1. 快速了解通义千问2.5-7B-Instruct 通义千问2.5-7B-Instruct是阿里云在2024年9月发布的70亿参数指令微调模型,属于中等体量的全能型AI助手,最大的特点是完全开源且可以商用。 这…...
深入解析BUCK、BOOST与Charge Pump电路的设计与应用
1. 开关电源基础:为什么需要BUCK、BOOST和Charge Pump? 刚入行那会儿,我总觉得电源设计就是个"变压器加整流桥"的事,直到某次项目里把12V电池直接怼到3.3V的MCU上——随着一缕青烟升起,我才明白电压转换这门…...
突破透明动画性能瓶颈:VAP引擎实现移动端高效视觉体验
突破透明动画性能瓶颈:VAP引擎实现移动端高效视觉体验 【免费下载链接】vap VAP是企鹅电竞开发,用于播放特效动画的实现方案。具有高压缩率、硬件解码等优点。同时支持 iOS,Android,Web 平台。 项目地址: https://gitcode.com/gh_mirrors/va/vap …...
ssm+java2026年毕设私人医生预约系统【源码+论文】
本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于在线医疗问诊服务的研究,现有研究主要以综合性互联网医疗平台的宏观发展分析为主,专门针对基于SSM…...
微信公众号开发入门:手把手教你配置接口信息(含服务器设置指南)
微信公众号开发从零到一:接口配置全流程详解 第一次接触微信公众号开发时,很多人会被"接口配置"这个概念吓到。作为一个从零开始摸索过来的开发者,我深知那种面对陌生术语时的茫然感。实际上,接口配置并没有想象中那么复…...
2026考公全攻略:在校生如何选岗、如何备考、如何上岸一次讲清
很多在校生最近都在问:现在开始准备公务员考试,还来得及吗先说结论:来得及,但前提是你要走对路径这几年考公环境已经发生明显变化报考人数持续增加岗位信息越来越透明单纯刷题已经不再有效考公正在从拼努力,变成拼策略…...
