首页/数据/数据库速查/Hash 字段级过期(7.4+ HEXPIRE)与旧版本替代
Redis 命令96 条

Hash 字段级过期(7.4+ HEXPIRE)与旧版本替代

Redis 7.4 起支持字段级过期:HEXPIRE key seconds FIELDS n field...;7.4 之前只能整键过期,或把字段拆成独立键。

数据库速查数据更新于 2026-10-13

Hash 字段级过期是什么

Redis 7.4 起支持给 Hash 的单个字段设置过期时间:HEXPIRE 指定字段与秒数,HTTL 查看剩余时间,HPERSIST 取消过期。在此之前只能对整个键过期,或者把每个字段拆成独立键各自维护 TTL。字段级过期适合会话、临时令牌这类「同一个对象里部分字段会过期、部分字段长期有效」的场景。

基本信息

适用版本Redis 7.4 起(低版本执行会报命令不存在)
设置HEXPIRE key seconds FIELDS n field...
查询HTTL key FIELDS n field...(-1 无过期、-2 字段不存在)
取消HPERSIST key FIELDS n field...
相关命令HEXPIREAT / HPEXPIRE / HPEXPIREAT 支持秒、毫秒与绝对时间
替代方案整键过期,或把字段拆成独立键各自设 TTL

典型使用场景

  • 登录会话:同一会话 Hash 中令牌字段过期,用户基础信息长期保留
  • 临时令牌与刷新令牌:两类字段的生存期不同
  • 风控标记:临时标记字段过期后自动消失,无需定时清理
  • 验证码与限流计数:字段级过期避免整键失效影响其他字段
  • 灰度开关:临时字段带 TTL,到期自动失效

7.4+ 字段过期用法

7.4+ 字段过期用法
HSET session:u1 token abc login_at 1700000000

# 只给 token 字段设置 1800 秒过期
HEXPIRE session:u1 1800 FIELDS 1 token

# 查看剩余时间:-1 表示无过期,-2 表示字段不存在
HTTL session:u1 FIELDS 1 token

# 取消该字段的过期时间
HPERSIST session:u1 FIELDS 1 token

# 毫秒精度与绝对时间版本
HPEXPIRE session:u1 60000 FIELDS 1 token

旧版本替代方案

旧版本替代方案
# 方案一:整键过期,所有字段一起失效
EXPIRE session:u1 1800

# 方案二:字段拆键,各自过期(结构更扁平,键数量增加)
SET session:u1:token abc EX 1800
SET session:u1:profile '{"name":"张三"}'

# 方案三:字段内自己记录过期时间戳,读取时判断并清理

方案对照

方案适用版本代价
字段级过期7.4+版本依赖强,混部环境不可用
整键过期全版本字段只能同时失效
字段拆键全版本键数量上升,元数据开销增加
应用层时间戳全版本需要读时判断与定期清理
选择依据是「字段生存期是否一致」:一致就用整键过期,差异明显且版本允许则用字段级过期;命名上把带 TTL 的会话键统一前缀,便于用 SCAN 统计与清理残留。
字段级过期是 7.4 新特性,老版本执行 HEXPIRE 会直接报命令不存在:上线前核对 redis_version,混部环境(客户端连的主从版本不一致)尤其危险,功能可能只在部分节点可用。

易错点

  • 在 7.2/7.0 上执行 HEXPIRE:命令不存在直接报错,功能上线要核对 redis_version
  • 混部环境下只在部分节点升级:功能在部分节点可用,行为不一致难以复现
  • 字段过期后仍按旧结构解析:HLEN 发生变化但客户端未做兼容判断
  • 把 HTTL 返回值当秒数直接比较:-1 与 -2 有特殊语义,必须先判断再使用
  • 用字段级过期承载关键业务数据:过期时间一旦设置错误,数据在无人察觉时消失

数据来源与参考

  • Redis 官方文档: HEXPIRE
  • Redis 7.4 Release Notes: Hash Field Expiration

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌