Redis原子性需用Lua脚本实现,因MULTI/EXEC不保证中间状态隔离;脚本通过EVAL单线程执行,KEYS和ARGV须规范传参,集群下多slot键需拆分处理,分布式锁须SET+NX+EX原子设值并用Lua校验解锁,SCRIPT LOAD+EVALSHA需容错NOSCRIPT。用 Lua 脚本封装多步操作,Redis 才认它是原子的Redis 本身没有"事务块内自动加锁"这回事,EXEC 只保证命令按序执行、不被其他客户端插入,但不保证中间状态不被读取或修改。真正实现复杂逻辑原子性,得靠 EVAL 或 EVALSHA 运行 Lua 脚本------脚本在服务端单线程执行,期间不会被中断或穿插其他命令。常见错误是以为 MULTI/EXEC 能搞定条件更新、计数+过期+通知这类组合操作。比如"库存大于 0 才扣减并记录日志",用事务根本拦不住并发超卖------因为 GET 和 DECR 是两轮网络往返,中间已被抢先改掉。脚本必须把所有读、判、写逻辑写进一个 EVAL 调用里,不能拆成多次请求用 redis.call() 调用 Redis 命令,别用 redis.pcall() 除非你真要捕获异常并手动处理(它不抛错,只返回状态表)脚本里不能用随机、时间、外部 I/O 等非确定性操作,否则主从复制可能不一致脚本长度建议控制在几百行内;太长会阻塞事件循环,影响其他请求EVAL "if redis.call('GET', KEYS1) > '0' then redis.call('DECR', KEYS1); return 1 else return 0 end" 1 inventory:sku123KEYS 和 ARGV 怎么传才不踩坑Lua 脚本里不能直接拼接 key 名,否则无法被 Redis 集群路由识别,也会触发 EVAL 安全限制。所有 key 必须显式通过 KEYS 数组传入,非 key 数据(如阈值、新值)走 ARGV。典型翻车场景:脚本里写 redis.call('GET', 'user:'..ARGV1),看着能跑,但在集群模式下直接报错 (error) MOVED;或者用 ARGV 传 key 名试图绕过校验,结果脚本被拒绝执行。KEYS 参数个数必须和脚本里 KEYSn 的最大索引一致,少传会报 ERR Error running script同一个脚本里多个 key,必须全部列在 KEYS 里,不能一部分硬编码、一部分拼接如果逻辑涉及不同 slot 的 key(比如用户信息和订单日志),Redis 集群下无法用单个脚本完成------得拆成多个原子操作,或改用单节点部署为什么不用 SETNX + EXPIRE 组合做分布式锁单独用 SETNX 加锁再 EXPIRE 设过期,不是原子的。万一进程在 SETNX 成功后崩溃或网络断开,EXPIRE 没发出去,锁就永远卡死。 Murf AI AI文本转语音生成工具
相关推荐
benchmark_cc20 小时前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?踏月的造梦星球20 小时前
DMDPC 学习:架构、部署、运维与调优韩楚风20 小时前
【参天引擎】事务生命周期 / MVCC / Undo / ACID / 分布式事务 功能域整体解析renhongxia121 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?程序员无隅21 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解Python+9921 小时前
Java 枚举类(Enum)详解:从基础到高级应用愿做无知一猿21 小时前
Nacos连接MySQL异常?DataGrip竟成救星G.O.G.O.G21 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)dunge20261 天前
2026年7月最新ChatGPT Plus / Pro 与 Codex:当 AI Agent 最新5.6版本来袭,必须理解事务、幂等与补偿研究员子楚1 天前
GEO行业发展标准体系白皮书V2.0-第10卷 · 全球篇:跨国标准协同与全球品牌语义治理框架