在 MULTI/EXEC 事务中,键可以过期吗?

最后更新时间:2024 年 5 月 8 日

问题

在 MULTI/EXEC 事务中,键可以过期吗?

答案

键可以在 MULTI/EXEC 事务中过期。查看以下示例。

127.0.0.1:6379> GET cnt
"1"
127.0.0.1:6379> EXPIRE cnt 10
(integer) 1
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> INCR cnt
QUEUED

等待一段时间并执行事务。

127.0.0.1:6379(TX)> EXEC
1) (integer) 1
127.0.0.1:6379> GET cnt
"1"

键 `cnt` 在事务中已过期,然后由 `INCR` 命令重新初始化为 1。

过期的 WATCH 键

另请注意,在 6.0.9 之前的 Redis 版本中,过期的 WATCH 键不会导致事务中止。从 6.0.9 开始,WATCH 键过期会导致事务中止。

127.0.0.1:6379> EXPIRE cnt 20
(integer) 1
127.0.0.1:6379> WATCH cnt
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> SET hola mundo
QUEUED

等待一段时间,观察事务是如何中止的。

127.0.0.1:6379(TX)> EXEC
(nil)

在 MULTI/EXEC 事务中修改 TTL

可以在 MULTI/EXEC 事务中直接修改键的过期时间。

127.0.0.1:6379> EXPIRE cnt 30
(integer) 1
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> EXPIRE cnt 1000
QUEUED
127.0.0.1:6379(TX)> EXEC
1) (integer) 1
127.0.0.1:6379> TTL cnt
(integer) 994