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

相关推荐
Duang007_4 分钟前
生产可观测性:从“系统慢“到“根因“的完整链路(Go / TypeScript)
后端·python·golang·typescript·prometheus
honsor7 分钟前
以太网温湿度传感器:RJ45直连机房的环境监控新方案
运维·网络·数据库·物联网·安全·云计算·github
西索斯coding8 分钟前
Kimi k2.7-code-highspeed 接入 Cline 教程:baseURL 路由变更 + model_id 正确写法
java·服务器·数据库·ai
jason.zeng@150220722 分钟前
(九)多轮对话式新增维修记录实现方案
python·prompt·交互·llama
浪子明X23 分钟前
MongoDB 迁移方案评审:用双写窗口和回放样本控制切换风险
数据库·mongodb
stark张宇27 分钟前
InnoDB锁机制全景图:全局锁、表锁、行锁、意向锁到底怎么用?
数据库·后端
黑妹天下第一乖27 分钟前
小智改造实战解读-首 token 延迟去哪了:云端与端侧大模型的分段对照
开发语言·人工智能·python·嵌入式硬件·自然语言处理·iot
用户0942485680330 分钟前
第29章:【OpenJDK中级篇综合实战】百万长连接网关的JVM稳定性工程
java·jvm
坊钰37 分钟前
【LangChain框架入门级】10. 文本向量与向量数据库(Embedding / Redis / Pinecone / MMR)
数据库·python·langchain·embedding
benchmark_cc1 小时前
本地已有一年历史 K 线,第二天更新别只拉“昨天一天”
python·数据分析·pandas·量化交易·股票数据·quantdash