EXPIRE无法原子续期多个key,因单命令仅支持一个key且网络异常会导致错期;必须用Lua脚本通过EVAL原子执行PEXPIRE批量续期,确保一致性。为什么 EXPIRE 不能直接用于多个 Key 的原子续期Redis 单个 EXPIRE 命令只能操作一个 key,而网络往返、客户端重试、中间失败都会导致多个 key 的过期时间不同步。比如你先对 order:123 续期,再对 order:123:lock 续期,中间若断连或超时,两个 key 就会"错期"------一个还活着,一个已过期,业务逻辑就可能出乱子。真正可靠的同步续期,必须靠服务端原子执行。Lua 脚本是唯一能保证多 key 操作在单次 Redis 执行中完成的方式。用 EVAL 执行 Lua 脚本批量续期的写法核心思路:把要续期的 key 列表和新 TTL 作为参数传入,脚本里遍历并统一调用 PEXPIRE(推荐用毫秒级,精度更高、避免秒级截断误差)。EVAL "for i=1,#KEYS do redis.call('PEXPIRE', KEYSi, ARGV1) end" 2 order:123 order:123:lock 30000KEYS 是 key 列表,ARGV1 是统一的新过期毫秒数(如 30000 表示 30 秒)注意:第一个数字 2 是 key 的数量,必须和实际传入的 key 个数一致,否则报错 ERR Error running script (call to f_...): @user_script:1: WRONGTYPE Operation against a key holding the wrong kind of value如果某个 key 不存在,PEXPIRE 返回 0,不影响其他 key,脚本继续执行续期前要不要先检查 key 是否存在?大多数场景下不用。续期动作本身是"保活",不是"创建"。如果 key 已被删,PEXPIRE 返回 0,脚本照常结束,客户端可据此判断是否需重建资源。强行加 EXISTS 判断反而增加复杂度,且无法规避"检查后被删"的竞态。但有例外:如果你依赖 key 存在作为业务状态标识(比如 user:456:session 必须存在才允许续期),那就得在脚本里显式判断: Vozo Vozo是一款强大的AI视频编辑工具,可以帮助用户轻松重写、配音和编辑视频。
相关推荐
ly76896 分钟前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地滴啦嘟啦哒19 分钟前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真全栈练习生35 分钟前
AI安全与红队测试小羊没烦恼!41 分钟前
Ajax与JSON的一些总结费曼学习法41 分钟前
把「发送成功」当「送达」?我排查 IM 长消息被静默吞掉的完整过程鸽鸽程序猿43 分钟前
【项目】【在线判题系统】b端题目增删改注塑机数据采集联网44 分钟前
如何解决注塑机数据采集联网对接MES系统数据WiFi传输数据不稳问题Lhappy嘻嘻1 小时前
读懂 JVM:内存模型、类加载机制、分代回收黄俊懿1 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式NetX行者1 小时前
Python 工程化入门:从脚本到规范的 Python 项目结构