首页/新闻资讯/正文详情

Lua 脚本与分布式锁

发布时间:2026/9/24 19:03:53 来源:云帆数科 栏目:资讯中心
Lua 脚本与分布式锁
Lua 脚本与分布式锁一、为什么需要 Lua 脚本核心问题判断和删除不是原子操作// 错误实现分两步执行 if (redis.get(lockKey).equals(myValue)) { // 步骤1判断 // ← ← ← 危险窗口此时锁可能已过期被别的线程抢走 redis.del(lockKey); // 步骤2删除 }竞态条件时间点锁的状态A 的操作结果T1A 的锁 (uuid-a)GET 返回 uuid-a判断通过✓T2[危险窗口] 锁过期无锁停顿/延迟/GC—T3B 的锁 (uuid-b)B 抢到新锁—T4B 的锁A 执行 DEL✗误删 B 的锁时序图服务实例 A (机器1) Redis 服务实例 B (机器2) | | | | SET order:lock:123 | | | valueuuid-a | | |-------------------------| | | 获取成功 | | | | | | [业务处理中...] | | | | 锁过期自动删除 | | |-------------------------| | | | | | SET order:lock:123 | | | valueuuid-b | | |-------------------------| | | B 获取成功 | | | | | GET order:lock:123 | | |-------------------------| | | 返回 uuid-b | | | A 对比uuid-a ≠ uuid-b| | 判断失败不会删除 | | | | | | [A 放弃删除] | | | | B 的锁安全保留 |关键判断时锁是自己的删除时已经是别人的。DEL 命令只按 key 删除不检查 value。二、Lua 脚本的作用1. 原子性保障Redis 执行 Lua 脚本是单线程原子操作Redis 单线程执行模型 客户端A请求 → [ Lua脚本GET → 判断 → DEL ] → 完成 ↑ 客户端B请求 → [ 排队等待... ] ← 脚本执行期间其他命令插不进来2. 实现判断 删除原子化luaif redis.call(get, KEYS[1]) ARGV[1] then -- 判断锁是否是自己的 return redis.call(del, KEYS[1]) -- 是自己的立即删除 else return 0 -- 不是自己的不删 end特性说明KEYS[1]锁的 key如stock:lock:1001ARGV[1]自己的唯一标识如uuid-a:42原子性整个脚本作为一个命令执行中间无中断三、Java 调用示例原生 RedisTemplateString luaScript if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end; Long result redisTemplate.execute( new DefaultRedisScript(luaScript, Long.class), Collections.singletonList(stock:lock:1001), // KEYS[1] uuid-a:42 // ARGV[1] ); // result: 1删除成功, 0不是自己的锁未删除Redisson 封装内部就是 LuaRLock lock redisson.getLock(stock:lock:1001); try { lock.lock(); // 业务逻辑 } finally { lock.unlock(); // 内部调用 Lua 脚本安全释放 }四、对比总结方式是否原子是否安全说明GET DEL分两步❌❌ 可能误删有竞态条件先判断再 DEL代码层❌❌ 仍可能误删判断和删除之间仍有窗口Lua 脚本✅✅ 安全释放Redis 单线程原子执行Redissonunlock()✅✅ 安全释放封装了 Lua推荐五、一句话总结Lua 脚本的本质把判断锁归属 删除锁打包成一个不可中断的原子操作消除竞态条件防止误删他人锁。

相关推荐

Linux用户组与附加组实战:从概念到命令彻底搞懂
Linux用户组与附加组实战:从概念到命令彻底搞懂

1. 先把概念讲清楚:用户、用户组与附加组各司其职上个月我在一台新装好的 Rocky Linux 9 上给项目组搭建共享环境,原计划半小时搞定,结果在“用户——用户组——附加组”这三层概念上来回绕了好几圈。很多人平时敲useradd、chown、chmod都很溜… · 2026/9/24 19:03:53

IP地址与子网掩码详解:从原理到Windows/Linux配置实战
IP地址与子网掩码详解:从原理到Windows/Linux配置实战

1. 先搞懂一张网卡的全貌:IP地址到底在表达什么很多人一听到“IP地址”和“子网掩码”,第一反应是“哦,我知道,就是网络配置里那两栏数字”。但真正被问到“为什么要填子网掩码”“填错了会怎样”的时候,能说清楚的人其… · 2026/9/24 19:03:53

软考网规WLAN考点全攻略:从802.11标准到安全配置
软考网规WLAN考点全攻略:从802.11标准到安全配置

1. 为什么WLAN这章容易“复习了跟没复习一样”软考网规的知识体量之大,相信每个备考过的人都有体会。路由、交换、安全、存储、机房、项目管理、英语,每一块都要花时间,于是很多人的策略是“战略性放弃”一些看起来占比不高的内容&#xff0c… · 2026/9/24 19:03:53

AI原生数据治理选型指南:五大平台能力分化与决策框架
AI原生数据治理选型指南:五大平台能力分化与决策框架

1. 当数据治理撞上AI原生,选型逻辑为什么突然变了过去几年做数据治理,大家聊得最多的是元数据采集覆盖率、血缘解析准确率、数据质量规则跑批时长这些指标。但从2025年下半年开始,我陆续参与了几个大型企业的数据平台升级评审,发现… · 2026/9/24 19:36:40

GNG生长型神经气体网络:自适应聚类的动态拓扑解法
GNG生长型神经气体网络:自适应聚类的动态拓扑解法

1. 什么是GNG生长型神经气体网络?它为什么能甩开K-means和DBSCAN几条街? “GNG生长型神经气体网络”——光看这名字,很多人第一反应是:又一个拗口的学术黑话。但如果你正在处理客户分群、异常检测、传感器数据压缩,或者… · 2026/9/24 19:36:40

MySQL状态查看与Navicat连接排查:从SHOW STATUS到Access denied实战
MySQL状态查看与Navicat连接排查:从SHOW STATUS到Access denied实战

说实话,这节MySQL课的后两节,信息量比前面几节加起来都大。老师先带我们把SHOW STATUS过了一遍,然后现场演示了 Navicat 链接 MySQL 的完整流程,下课的时候还有一半人卡在 Access denied 上——包括我。回来我花了一整个晚上把课堂… · 2026/9/24 19:36:40

acore-db-app:Python封装库,让AzerothCore数据库操作化繁为简
acore-db-app:Python封装库,让AzerothCore数据库操作化繁为简

维护AzerothCore服务端的朋友应该都有过这种经历:开发到后期,各种数据修复、批量任务、跨库同步的需求接踵而来,每天不是在写SQL,就是在写连接数据库的Python脚本。我自己的痛点是,pymysql裸用起来倒是不难&#xff0c… · 2026/9/24 19:36:40

MySQL 状态查看与 Navicat 连接失败排查指南
MySQL 状态查看与 Navicat 连接失败排查指南

上午后两节课,正好讲到了MySQL状态和Navicat链接MySQL,这两块其实都是日常开发里最高频的操作:一个是判断数据库到底健不健康,一个是让你从黑窗口里解放出来。如果你刚装好MySQL不知道下一步干什么,或者被Navicat连接时… · 2026/9/24 19:36:40

Python智慧教室源码实战:专注度分析、作弊检测与动态点名
Python智慧教室源码实战:专注度分析、作弊检测与动态点名

简介:这是一套面向教育技术开发者与Python学习者的智慧教室综合实践源码,围绕课堂专注度分析、考试作弊检测与动态点名三大场景展开,适合希望将计算机视觉、自然语言处理落地到教学管理的中级开发者参考。压缩包共218个文件、约17.04MB&#… · 2026/9/24 19:36:34

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码