给字段单独设过期
Redis 7.4 起支持给 hash 里的单个字段设置过期时间(HEXPIRE、HPEXPIRE 等命令族),不再只能给整个键设 TTL。它让「一个键里不同数据的生命周期不同」这类需求有了原生支持,代价是字段过期记录带来的内存与回收开销。
基本信息
| 命令族 | HEXPIRE / HPEXPIRE / HEXPIREAT / HTTL / HPTTL / HPERSIST |
|---|---|
| 版本 | Redis 7.4 起 |
| 适用范围 | hash 的字段粒度 |
| 成本 | 字段过期记录与回收扫描开销 |
典型使用场景
- 会话数据里不同字段有效期不同,例如令牌短期、偏好长期
- 用户画像聚合键里部分维度需要定期刷新
- 用一个大 hash 承载多租户配置,按字段控制过期
- 替代「按字段拆成多个键」带来的键数量膨胀
- 日志类聚合数据按字段滚动过期
字段级过期用法
字段级过期用法
# 给 hash 里的单个字段设置过期时间(单位秒)
redis-cli HEXPIRE session:1001 3600 FIELDS 1 token
# 查看字段剩余过期时间:-1 表示未设置,-2 表示字段不存在
redis-cli HTTL session:1001 FIELDS 1 token
# 批量给多个字段设置过期时间
redis-cli HEXPIRE session:1001 7200 FIELDS 2 token refresh_at
# 观察带字段过期的键的实际内存占用
redis-cli MEMORY USAGE session:1001命令对照
| 命令 | 作用 | 注意点 |
|---|---|---|
| HEXPIRE | 按秒设置字段过期 | 需要 FIELDS 与字段名 |
| HPEXPIRE | 按毫秒设置字段过期 | 精度更高,适合短周期字段 |
| HTTL | 查看字段剩余秒数 | -1 未设过期,-2 字段不存在 |
| HPERSIST | 取消字段的过期时间 | 与整键的 PERSIST 要区分开 |
| MEMORY USAGE | 查看键的实际占用 | 字段多且过期密集时开销明显 |
字段过期由主线程按抽样方式回收,字段数量巨大且过期时间集中在同一时刻时,回收压力会体现在延迟上;给过期时间加一点随机抖动会更平稳。
这是较新的能力,旧版服务端与老客户端封装可能不认识该命令族;接入前核对服务端版本与客户端支持情况,避免上线后才发现调用失败。