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', KEYS[1]) > '0' then redis.call('DECR', KEYS[1]); return 1 else return 0 end" 1 inventory:sku123KEYS 和 ARGV 怎么传才不踩坑Lua 脚本里不能直接拼接 key 名,否则无法被 Redis 集群路由识别,也会触发 EVAL 安全限制。所有 key 必须显式通过 KEYS 数组传入,非 key 数据(如阈值、新值)走 ARGV。典型翻车场景:脚本里写 redis.call('GET', 'user:'..ARGV[1]),看着能跑,但在集群模式下直接报错 (error) MOVED;或者用 ARGV 传 key 名试图绕过校验,结果脚本被拒绝执行。KEYS 参数个数必须和脚本里 KEYS[n] 的最大索引一致,少传会报 ERR Error running script同一个脚本里多个 key,必须全部列在 KEYS 里,不能一部分硬编码、一部分拼接如果逻辑涉及不同 slot 的 key(比如用户信息和订单日志),Redis 集群下无法用单个脚本完成------得拆成多个原子操作,或改用单节点部署为什么不用 SETNX + EXPIRE 组合做分布式锁单独用 SETNX 加锁再 EXPIRE 设过期,不是原子的。万一进程在 SETNX 成功后崩溃或网络断开,EXPIRE 没发出去,锁就永远卡死。 Murf AI AI文本转语音生成工具
相关推荐
m0_493934532 小时前
宝塔面板如何实现异地数据库备份_配置远程存储空间yuanpan2 小时前
Python 读写 Redis 缓存数据库:写给 Python 初学者的入门案例m0_684501982 小时前
HTML图片怎么用Bitbucket Pipelines发布_Bitbucket自动构建HTML站点小江的记录本2 小时前
【分布式】分布式核心组件——分布式限流:固定窗口、滑动窗口、漏桶、令牌桶算法,网关层/服务层限流实现MediaTea2 小时前
Scikit-learn:特征矩阵与目标变量HappyAcmen2 小时前
4.字典dict全部用法好家伙VCC2 小时前
# React发散创新:从状态管理到自定义Hook的极致实践与性能优化在现代前端开发郝学胜-神的一滴2 小时前
深度学习入门:极简神经网络搭建与参数计算全攻略Metaphor6922 小时前
使用 Python 提取 PDF 文件中的文本、表格、图片