当前位置: 首页 > news >正文

分布式锁的原子性问题

4.6 分布式锁的原子性问题

更为极端的误删逻辑说明:

线程1现在持有锁之后,在执行业务逻辑过程中,他正准备删除锁,而且已经走到了条件判断的过程中,比如他已经拿到了当前这把锁确实是属于他自己的,正准备删除锁,但是此时他的锁到期了,那么此时线程2进来,但是线程1他会接着往后执行,当他卡顿结束后,他直接就会执行删除锁那行代码,相当于条件判断并没有起到作用,这就是删锁时的原子性问题,之所以有这个问题,是因为线程1的拿锁,比锁,删锁,实际上并不是原子性的,我们要防止刚才的情况发生,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.7 Lua脚本解决多条命令原子性问题

Redis提供了Lua脚本功能,在一个脚本中编写多条Redis命令,确保多条命令执行时的原子性。Lua是一种编程语言,它的基本语法大家可以参考网站:https://www.runoob.com/lua/lua-tutorial.html,这里重点介绍Redis提供的调用函数,我们可以使用lua去操作redis,又能保证他的原子性,这样就可以实现拿锁比锁删锁是一个原子性动作了,作为Java程序员这一块并不作一个简单要求,并不需要大家过于精通,只需要知道他有什么作用即可。

这里重点介绍Redis提供的调用函数,语法如下:

redis.call('命令名称', 'key', '其它参数', ...)

例如,我们要执行set name jack,则脚本是这样:

# 执行 set name jack
redis.call('set', 'name', 'jack')

例如,我们要先执行set name Rose,再执行get name,则脚本如下:

# 先执行 set name jack
redis.call('set', 'name', 'Rose')
# 再执行 get name
local name = redis.call('get', 'name')
# 返回
return name

写好脚本以后,需要用Redis命令来调用脚本,调用脚本的常见命令如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例如,我们要执行 redis.call(‘set’, ‘name’, ‘jack’) 这个脚本,语法如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果脚本中的key、value不想写死,可以作为参数传递。key类型参数会放入KEYS数组,其它参数会放入ARGV数组,在脚本中可以从KEYS和ARGV数组获取这些参数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来我们来回一下我们释放锁的逻辑:

释放锁的业务流程是这样的

​ 1、获取锁中的线程标示

​ 2、判断是否与指定的标示(当前线程标示)一致

​ 3、如果一致则释放锁(删除)

​ 4、如果不一致则什么都不做

如果用Lua脚本来表示则是这样的:

最终我们操作redis的拿锁比锁删锁的lua脚本就会变成这样

-- 这里的 KEYS[1] 就是锁的key,这里的ARGV[1] 就是当前线程标示
-- 获取锁中的标示,判断是否与当前线程标示一致
if (redis.call('GET', KEYS[1]) == ARGV[1]) then-- 一致,则删除锁return redis.call('DEL', KEYS[1])
end
-- 不一致,则直接返回
return 0

相关文章:

分布式锁的原子性问题

4.6 分布式锁的原子性问题 更为极端的误删逻辑说明: 线程1现在持有锁之后,在执行业务逻辑过程中,他正准备删除锁,而且已经走到了条件判断的过程中,比如他已经拿到了当前这把锁确实是属于他自己的,正准备删…...

从零自制docker-8-【构建实现run命令的容器】

文章目录 log "github.com/sirupsen/logrus"args...go moduleimport第三方包失败package和 go import的导入go build . 和go runcli库log.SetFormatter(&log.JSONFormatter{})error和nil的关系cmd.Wait()和cmd.Start()arg……context.Args().Get(0)syscall.Exec和…...

2024.03.31 校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、自动驾驶一周资讯 -小米SU7上市24小时,大定达88898台;小鹏汽车正式进入德国市场;地平线递交港股上市申请 自动驾驶一周资讯 -小米SU7上市24小时&…...

邦芒职场:塑造职场人气王的秘诀

在职场中,有些人总能吸引众人的目光,成为团队的焦点;而有些人却常常默默无闻,难以融入。那么,如何在职场中脱颖而出,成为一个受欢迎的人呢?下面,让我们来探讨一下塑造职场人气王的秘…...

滤波器网络变压器的作用

网络变压器的作用主要包括以下几点: 1. 信号传输:网络变压器可以将PHY送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并且通过电磁场的转换耦合到不同电平的连接网线的另外一端以达到传输数据的目的。 2. 电气电压隔离&#xff1a…...

Python —— 简述

Houdini Python | 笔记合集 - 知乎 Houdini内置三大语言: 表达式,主要用于节点参数控制,可实现跨模块控制;vex,速度最快(比表达式和Python快一个数量级),非常适合密集型计算环境&…...

使用Rust加速Python程序,让代码飞起来

作为一种解释型语言,Python在开发速度和灵活性方面具有明显的优势,但在性能方面却不如编译型语言如C或Rust。对于性能要求苛刻的应用程序,如果纯粹使用Python编写可能会运行缓慢,影响用户体验。因此,如何利用Rust来加速…...

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(八)- 向量整数算术指令

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容: 这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…...

Qt Designer在布局中调整控件垂直伸展或者水平伸展之后控件没有变化

QtDesigner设置垂直伸展 在Qt Designer中,要对网格布局中的每一个网格设置垂直伸展,可以按照以下步骤操作: 1.打开Qt Designer并打开你的UI文件。 2.确保你的布局是一个网格布局(QGridLayout)。 3.选中你想要设置垂直…...

微信公众号粉丝迁移费用是多少?

公众号迁移后原来内容还在么?通过公众号迁移,可以实现这些目的:主体变更、开通留言功能、多号合并、订阅号升级为服务号、服务号转为订阅号。公众号迁移流程:①申请公证;②提交迁移申请;③第三方审核&#…...

基于Vue3 中后台管理系统框架

基于Vue3 中后台管理系统框架 文章目录 基于Vue3 中后台管理系统框架一、特点二、源码下载地址 一款开箱即用的 Vue 中后台管理系统框架,支持多款 UI 组件库,兼容PC、移动端。vue-admin, vue-element-admin, vue后台, 后台系统, 后台框架, 管理后台, 管理…...

Agent调研--19类Agent框架对比

代理(Agent)指能自主感知环境并采取行动实现目标的智能体,即AI作为一个人或一个组织的代表,进行某种特定行为和交易,降低一个人或组织的工作复杂程度,减少工作量和沟通成本。 背景 目前,我们在探…...

蓝桥杯-求阶乘

问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…...

计算两个日期之间相差的天数的四种方法

计算两个日期之间相差的天数的四种方法 第一种&#xff1a;时间戳的方式&#xff0c;计算两个日期的时间戳的差&#xff0c;再除当天的毫秒数即可得到相差的天数。 public static void main(String[] args) {DateFormat dft new SimpleDateFormat("yyyy-MM-dd");t…...

【leetcode面试经典150题】42. 有效的字母异位词(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…...

Windows 2003 R2与Windows 2022建立域信任报错:本地安全机构无法跟域控制器获得RPC连接。请检查名称是否可以解析,服务器是否可用。

在Windows Server 2003 R2与Windows Server 2022之间建立域信任时遇到“本地安全机构无法与域控制器获得RPC连接”的错误&#xff0c;可能是由于以下几种原因&#xff1a; DNS 解析问题&#xff1a; 确保源域和目标域的DNS配置正确&#xff0c;能够互相解析对方的域名和IP地址。…...

UE5、CesiumForUnreal实现加载建筑轮廓GeoJson数据生成白模功能

1.实现目标 在UE5.3中,通过加载本地建筑边界轮廓面GeoJson数据,获取底面轮廓和楼高数据,拉伸生成白模,并支持点选高亮。为防止阻塞Game线程,使用了异步任务进行优化,GIF动图如下所示: 其中建筑数量:128871,顶点索引数量:6695748,三角面数量:2231916,顶点数量:165…...

JavaGUI编程

目录 GUI概念 Swing概念 组件 容器组件 窗口&#xff08;JFrame&#xff09; 代码 运行 面板&#xff08;JPanel&#xff09; 代码 运行 布局管理器 FlowLayout 代码 运行 BorderLayout 代码 运行 GridLayout 代码 运行 常用组件 标签(JLabel) 代码 运…...

Nginx 基础应用实战 03 基于反向代理的负载均衡、https配置

Nginx 基础应用实战 03 反向代理 proxy_pass http://baidu.com; location /mashibing {proxy_pass http://mashibing.com/;}基于反向代理的负载均衡 upstream httpd {server 192.168.43.152:80;server 192.168.43.153:80; }weight(权重) 指定轮询几率&#xff0c;weight和访…...

[图解]DDD领域驱动设计伪创新-聚合根02

0 00:00:04,940 --> 00:00:06,993 在领域驱动设计之前 1 00:00:06,993 --> 00:00:09,503 的软件开发书籍里面 2 00:00:09,503 --> 00:00:12,470 并没有出现聚合根这样的说法 3 00:00:13,000 --> 00:00:14,840 大家可以去找一下 4 00:00:15,120 --> 00:00:15…...

泰勒级数实战:如何快速估算任意数的平方根(附Python代码)

泰勒级数实战&#xff1a;如何快速估算任意数的平方根&#xff08;附Python代码&#xff09; 在工程计算和科学实验中&#xff0c;快速估算平方根是一项常见需求。传统查表法精度有限&#xff0c;而现代计算器又过度依赖硬件。泰勒级数展开提供了一种优雅的数学解决方案——通过…...

5G NR Rel16测量上报事件深度解析:从A1到I1的触发机制与应用场景

1. 5G测量上报事件的核心作用 当你用手机刷视频时&#xff0c;有没有想过为什么从客厅走到阳台&#xff0c;视频还能流畅播放不卡顿&#xff1f;这背后其实是5G网络在默默执行"接力赛"——通过基站间的无缝切换保障连续通信。而测量上报事件就是这场接力赛的发令枪&a…...

Python MCP服务性能翻倍实录:基于asyncpg+uvloop+Pydantic V2的模板优化路径(QPS从83→417实测数据)

第一章&#xff1a;Python MCP服务性能翻倍实录&#xff1a;基于asyncpguvloopPydantic V2的模板优化路径&#xff08;QPS从83→417实测数据&#xff09; 在高并发MCP&#xff08;Microservice Control Plane&#xff09;服务场景中&#xff0c;原基于Flask SQLAlchemy CPyth…...

OpenClaw技能组合:GLM-4.7-Flash多技能协同工作的配置技巧

OpenClaw技能组合&#xff1a;GLM-4.7-Flash多技能协同工作的配置技巧 1. 为什么需要多技能协同&#xff1f; 去年冬天&#xff0c;我接手了一个内容运营的兼职项目。每天需要从十几个来源收集资料&#xff0c;整理成Markdown笔记&#xff0c;再根据主题生成不同风格的公众号…...

AI小剧场:OpenClaw+nanobot镜像多角色对话生成

AI小剧场&#xff1a;OpenClawnanobot镜像多角色对话生成 1. 为什么需要AI辅助剧本创作 作为一个业余编剧爱好者&#xff0c;我经常遇到创作瓶颈——当需要构建多角色对话场景时&#xff0c;很难同时兼顾不同角色的立场连贯性和语言风格差异。传统写作工具只能提供单向输出&a…...

【声纳与人工智能融合——从理论前沿到自主系统实战】第四章 认知声纳与自适应信号处理(AI+SP深度融合)

目录 第四章 认知声纳与自适应信号处理(AI+SP深度融合) 4.1 认知声纳系统架构与感知循环 4.1.1 感知-规划-行动闭环设计 4.1.1.1 动态环境感知与反馈机制 4.1.1.2 基于强化学习的波形自适应选择 4.1.2 开放式认知声纳体系结构 4.1.2.1 硬件可重配置架构(SDR) 4.1.2…...

别再只会用QProgressBar了!用QPainterPath绘制Qt自定义进度条的完整指南

用QPainterPath实现Qt动态进度条的终极艺术 当标准进度条无法满足现代UI设计需求时&#xff0c;Qt的绘图系统为我们打开了无限可能。想象一下&#xff1a;你的应用加载界面不是单调的横条&#xff0c;而是会呼吸的光环、跳动的粒子流或是随音乐律动的波形——这些令人眼前一亮的…...

LeetCode 283. Move Zeroes 题解

LeetCode 283. Move Zeroes 题解 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1&#xff1a; 输入: nums [0,1,0,3,12] 输…...

保姆级教程:用Code Blocks搞定中科蓝讯AB5768E蓝牙音响SDK开发环境(附资源包)

从零构建中科蓝讯AB5768E蓝牙音响开发环境&#xff1a;原理剖析与实战避坑指南 刚拿到中科蓝讯K12开发板时&#xff0c;面对陌生的AB5768E芯片和配套SDK&#xff0c;不少开发者会陷入"环境配置地狱"——明明按照文档操作&#xff0c;却总是卡在编译器报错、路径缺失等…...

2021 年 3 月青少年软编等考 C 语言四级真题解析

目录 T1. 酒鬼 思路分析 T2. 重启系统 思路分析 T3. 鸣人的影分身 思路分析 T4. 宠物小精灵之收服 思路分析 T1. 酒鬼 题目链接:SOJ D1053 Santo 刚刚与房东打赌赢得了一间在 New Clondike 的大客厅。今天,他来到这个大客厅欣赏他的奖品。房东摆出了一行瓶子在酒吧上。瓶子…...