Redis如何实现复杂逻辑的原子操作

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文本转语音生成工具

相关推荐
Angeldream1237 分钟前
第 10 章 医学影像伦理与安全
图像处理·人工智能·python·安全·机器学习·医学影像
GeW20 分钟前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
勤奋的大熊猫22 分钟前
Python 双层 enumerate 循环选取最后一层循环的优雅写法
python
SelectDB27 分钟前
Doris Arrow Flight SQL 高速读取协议实战:与 Snowflake 客户端取数链路对照
大数据·数据库·数据分析
JYCJ_28 分钟前
星愿池·子项清单
python
曼岛_28 分钟前
[图解密码学]第4章 古典密码
java·数据库·密码学
Wang's Blog30 分钟前
Java 项目实战: 交友项目 - 动态查询开工:昨日回顾与今日任务
java·python·交友
2601_9679791233 分钟前
0 到 1 学爬虫:用 Python 爬取网页数据指南一(附实战案例)
爬虫·python·实战案例·html解析·网页数据
云和数据.ChenGuang43 分钟前
光哥说Python 异常深度解析:从异常模型到工程化实践
java·前端·人工智能·python·langchain
SelectDB1 小时前
云数仓月度账单总是超预算:Apache Doris 与 Snowflake 五类成本项拆解与对账脚本
python