首页/数据/Redis 进阶速查/字段级 TTL 与内存新选择
内存与管理99 条

字段级 TTL 与内存新选择

Redis 7.4 起支持对 hash 字段设置独立过期(HEXPIRE/HPEXPIRE 等);字段级 TTL 比整键 TTL 更精细,代价是字段过期记录的内存与回收成本。

Redis 进阶速查数据更新于 2026-10-13

给字段单独设过期

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查看键的实际占用字段多且过期密集时开销明显
字段过期由主线程按抽样方式回收,字段数量巨大且过期时间集中在同一时刻时,回收压力会体现在延迟上;给过期时间加一点随机抖动会更平稳。
这是较新的能力,旧版服务端与老客户端封装可能不认识该命令族;接入前核对服务端版本与客户端支持情况,避免上线后才发现调用失败。

易错点

  • 用字段级 TTL 承载海量字段 → 过期记录与扫描回收开销叠加,内存和延迟同时上升 → 先评估字段数量与过期密度,必要时退回整键 TTL
  • 把所有字段的过期时间设在同一时刻 → 大量字段同时到期,回收造成延迟尖刺 → 过期时间加随机抖动打散
  • 在低版本服务端上直接使用该命令族 → 命令不存在,功能不可用 → 上线前核对服务端版本与客户端封装
  • 用 HTTL 的返回值判断字段是否存在 → -1 与 -2 语义不同,容易误判 → 先区分「未设过期」与「字段不存在」

数据来源与参考

  • Redis 官方文档:字段过期命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌