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,混部环境(客户端连的主从版本不一致)尤其危险,功能可能只在部分节点可用。