You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis事务执行中键是否会过期?未用Watch为何目标键未消失

问题分析:Redis事务中键未过期消失的原因

执行的命令:

del dict
echo "log: set foo, expire 1"
hset dict key bar
expire dict 1

multi
hset dict key nowatchvalue
debug sleep 1
hget dict key
exec

执行结果:

(integer) 1
"log: set foo, expire 1"
(integer) 1
(integer) 1
OK
QUEUED
QUEUED
QUEUED
1) (integer) 0     // result from "hset dict key nowatchvalue"
2) OK              // result from "debug sleep 1"
3) "nowatchvalue"  // result from "hget dict key"
(1.00s)

原因解释:

核心原因是Redis事务的原子性执行机制,以及过期键删除的触发逻辑:

  • 事务执行的原子性:通过multi开启事务后,所有命令会被放入队列,直到exec才会一次性连续执行,整个过程不会被任何其他操作(包括过期键删除)打断。
  • 过期删除不会在事务中途触发:即使debug sleep 1让事务执行时间超过了expire dict 1设置的1秒过期时间,Redis也不会在事务执行过程中删除涉及的键dict——事务需要保证所有命令都基于一致的数据状态执行,中途删除键会破坏事务的原子性。
  • 写操作不影响过期时间:这里的hset只是更新哈希字段,不会重置dict的过期时间,但这不是键未消失的核心原因,真正关键是事务执行期间的保护机制。

只有当整个事务的所有命令都执行完成后,Redis的过期键删除机制(惰性删除/定期删除)才会处理dict键,此时它才会被删除。

内容的提问来源于stack exchange,提问作者ramwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 12:52:42