Redis怎样利用Lua为多个Key同步续期

张开发
2026/4/16 6:41:20 15 分钟阅读

分享文章

Redis怎样利用Lua为多个Key同步续期
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 i1,#KEYS do redis.call(PEXPIRE, KEYS[i], ARGV[1]) end 2 order:123 order:123:lock 30000KEYS 是 key 列表ARGV[1] 是统一的新过期毫秒数如 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视频编辑工具可以帮助用户轻松重写、配音和编辑视频。

更多文章