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
相关产品推荐
相关产品推荐

