*Redis HEXPIRE 命令

为 Hash 中的一个或多个 field 设置 TTL(秒)。Redis 7.4+ 引入。


*语法

HEXPIRE key seconds field [field ...] [NX | XX | GT | LT]

*参数说明

参数 类型 必填 说明
key String Hash 键名
seconds Integer 过期时间(秒)
field String 要设置过期的字段,可一次设置多个
NX 标志 只在 field 没有过期时间时设置
XX 标志 只在 field 已有过期时间时设置
GT 标志 只在新的过期时间大于现有过期时间时设置
LT 标志 只在新的过期时间小于现有过期时间时设置

*返回值

条件 返回值
对每个 field -2: field 不存在; -1: key 不存在; 0: 条件未满足; 1: 设置成功

*时间复杂度

O(N),N 为 field 数量。


*示例

> HSET user:1001 name "Alice" email "alice@example.com" age "30"
(integer) 3

# 设置 name 和 email 10 秒后过期
> HEXPIRE user:1001 10 name email
1) (integer) 1
2) (integer) 1

# 检查 TTL
> HTTL user:1001 name
1) (integer) 8

# 设置 age 20 秒过期,但只在没有过期时间时设置
> HEXPIRE user:1001 20 age NX
1) (integer) 1

# 再次设置失败(因为已有 TTL)
> HEXPIRE user:1001 30 age NX
1) (integer) 0

*常见错误

  1. 对非 Hash 使用:返回 WRONGTYPE。
  2. NX/XX/GT/LT 冲突:同时指定冲突条件会报错。

*最佳实践

  1. 字段级过期:为 Hash 中特定字段设置 TTL,实现更细粒度的缓存控制。例如用户会话中,某些字段需要更短的过期时间。
  2. 条件过期:用 NX 避免覆盖已有 TTL,用 XX 只更新已有 TTL 的字段。

*FAQ

Q: HEXPIRE 和 EXPIRE 有什么区别? A: EXPIRE 为整个 key 设置 TTL;HEXPIRE 为 Hash 中的单个 field 设置 TTL,更细粒度。

Q: Hash 本身有 TTL 时,field 的 TTL 如何工作? A: Hash 的 TTL 和 field 的 TTL 独立。如果 Hash 本身过期,所有字段都会被删除。如果字段先过期,只删除该字段,Hash 其他字段保留。

Q: HEXPIRE 支持所有 Redis 版本吗? A: 仅 Redis 7.4+ 支持。旧版本会返回错误。