*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
*常见错误
- 对非 Hash 使用:返回 WRONGTYPE。
- NX/XX/GT/LT 冲突:同时指定冲突条件会报错。
*最佳实践
- 字段级过期:为 Hash 中特定字段设置 TTL,实现更细粒度的缓存控制。例如用户会话中,某些字段需要更短的过期时间。
- 条件过期:用 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+ 支持。旧版本会返回错误。