键可以在 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 的键

另请注意,在 Redis 6.0.9 之前的版本中,过期的被 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