*Redis EXPIRE 命令

为 key 设置过期时间(秒)。过期后 key 自动删除。


*语法

EXPIRE key seconds [NX | XX | GT | LT]

*参数说明

参数 类型 必填 说明
key String 键名
seconds Integer 过期时间(秒),必须 >= 0
NX 标志 仅在 key 没有 TTL 时设置(Redis 7.0+)
XX 标志 仅在 key 已有 TTL 时设置(Redis 7.0+)
GT 标志 仅在新 TTL 大于当前 TTL 时设置(Redis 7.0+)
LT 标志 仅在新 TTL 小于当前 TTL 时设置(Redis 7.0+)

*返回值

条件 返回值
设置成功 1
key 不存在或条件不满足 0

*时间复杂度

O(1)

*

*示例

> SET session:abc "data"
OK
> EXPIRE session:abc 3600
(integer) 1

> TTL session:abc
(integer) 3599

# key 不存在
> EXPIRE nokey 60
(integer) 0

# XX:仅在已有 TTL 时更新
> EXPIRE session:abc 7200 XX
(integer) 1

*常见错误

  1. seconds 为负数:Redis 7.0- 会直接删除 key;7.0+ 报错。
  2. 对不存在 key 设置:返回 0,不报错。
  3. GT/LT 条件不满足:返回 0。

*最佳实践

  1. 缓存必须设 TTL:缓存场景写入时总是设置过期时间,防止脏数据和内存无限增长。
  2. 滑动窗口:需要延长会话时重新 EXPIRE,而非先 DELSET
  3. 精确控制:需要毫秒级精度时使用 PEXPIRE,需要绝对时间使用 EXPIREAT

*FAQ

Q: EXPIRE 和 SET EX 有什么区别? A: EXPIRE 是给已有 key 加 TTLSET EX 是原子地设置 key + TTL。缓存写入推荐 SET + EX。

Q: 过期时间到了 key 会立即消失吗? A: 不一定。Redis 过期是惰性(访问时检查)+ 定期(后台扫描),极端情况下可能延迟删除。

Q: 如何取消 key 的过期时间? A: PERSIST key 可移除 TTL,让 key 永不过期。