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

相关推荐
Yang96113 分钟前
一台顶三台:鼎讯DLJ-1在不同故障类型中的模式切换数据复盘
服务器·网络·数据库
潘正翔9 分钟前
Memcached构建缓存服务器
运维·服务器·数据库·缓存·云原生·memcached
NineData20 分钟前
NineData 与平凯数据库(TiDB 企业版)完成产品兼容性互认证
数据库·tidb·ninedata·玖章算术·平凯数据库·产品兼容性认证·tidb企业版
咖啡星人k29 分钟前
2026 Text-to-SQL:一句话让 AI 写 SQL,自然语言直接查数据库(MonkeyCode 云端实战)
数据库·机器学习·语言模型·自然语言处理
GreatSQL社区32 分钟前
少敲一个字母,GreatSQL 对所有查询“已读不回”
数据库·mysql·greatsql
BS30813_vx34 分钟前
【编号:01652】Spring Boot村务管理系统:财务公开、党建活动与计生服务一体化实战
开发语言·python
边吃番茄边敲代码1 小时前
从本地工具到 MCP:给 Agent 接入独立工具服务,并补齐自动化测试
人工智能·python·功能测试·ai·单元测试·pytest
SugarAbsinthe1 小时前
【Agent开发实习小记】从人工逐条验证到自动化验收:新 API 接入前的效率瓶颈
人工智能·python·自动化·pytest
liwulin05061 小时前
【VSCODE】能在终端打印的图标
python
wangchunyu1141 小时前
PostgreSQL 入门与实践:从零搭建一个 CRUD 应用
数据库·postgresql