Redis命令:HPEXPIRETIME

发布时间:2026/10/3 13:53:36
Redis命令:HPEXPIRETIME Redis HPEXPIRETIME 命令详细教程HPEXPIRETIME查询 Hash 中一个或多个字段的绝对到期时刻返回 Unix 毫秒级时间戳。它是只读命令不修改任何字段或期限。资料合集https://pan.quark.cn/s/10e98d308913、https://pan.quark.cn/s/f56bc69c5338一、概览与语法HPEXPIRETIME key FIELDS numfields field [field ...]项目说明数据类型Hash 的字段级过期时间支持版本Redis 7.4.0 起key一个 Hash KeyFIELDS必填关键字不可省略numfields字段数量必须与后续字段参数个数一致field至少一个字段名不支持通配符返回值数组元素顺序与输入字段顺序一致时间复杂度O(N)N 为指定字段数量ACLread、hash、fast命令标记readonly、fast官方说明本命令语义与 HEXPIRETIME 相同但返回的绝对 Unix 到期时间戳以毫秒为单位而不是秒。$TRAE_REF二、返回值含义数值含义-2该字段不存在或整个 Key 不存在-1该字段存在但没有设置任何过期时间永久字段正整数到期时刻的 Unix 毫秒时间戳-1与-2含义完全不同前者表示字段存在且永久有效后者表示字段不存在。把两者都当成“没有过期时间”会造成逻辑错误。毫秒时间戳是 13 位十进制数远超 32 位整数范围客户端必须使用 64 位整数解析。$TRAE_REF三、基础示例以下命令需要 Redis 7.4 或更新版本在测试实例的 redis-cli 中执行。文中结果是预期说明未实际连接 Redis 运行。官方示例中先设置 300 秒 TTL再查询得到形如1715705913659的毫秒时间戳。DEL tutorial:{hpexpiretime}:profile HSET tutorial:{hpexpiretime}:profile field1 hello field2 world HEXPIRETIME tutorial:{hpexpiretime}:profile FIELDS 3 field1 field2 absent HEXPIRE tutorial:{hpexpiretime}:profile 300 FIELDS 2 field1 field2 HPEXPIRETIME tutorial:{hpexpiretime}:profile FIELDS 2 field1 field2 HPTTL tutorial:{hpexpiretime}:profile FIELDS 2 field1 field2 HPEXPIRETIME tutorial:{hpexpiretime}:missing FIELDS 1 field1预期结果第一次查询返回[-1, -1, -2]即 field1 与 field2 存在但无 TTLabsent 不存在。设置 300 秒 TTL 后HPEXPIRETIME 返回两个相同的毫秒时间戳HPTTL 返回接近 300000 的毫秒剩余值。对不存在的 Key 查询返回[-2]。HPEXPIRETIME 在期限内保持稳定而 HPTTL 随时间递减。需要判断“什么时候到期”用前者需要判断“还能活多久”用后者。四、与其他时间查询命令的区别命令作用对象单位语义TTL / PTTL整个 Key秒 / 毫秒剩余生存时间HTTL / HPTTLHash 字段秒 / 毫秒剩余生存时间EXPIRETIME / PEXPIRETIME整个 Key秒 / 毫秒绝对到期时刻HEXPIRETIME / HPEXPIRETIMEHash 字段秒 / 毫秒绝对到期时刻不要用 HPEXPIRETIME 减去本地当前时间自行计算剩余时长客户端与服务端时钟不一致时结果会失真需要剩余时长时直接使用 HPTTL。五、时间基准与只读语义时间戳由服务端时钟决定。多实例时钟存在漂移时同一逻辑时刻可能返回不同数值因此不要把某实例返回的时间戳当作跨实例统一基准也不要用它做分布式排序。HPEXPIRETIME 是只读命令查询不会刷新字段 TTL不会创建 Key也不会因为读取而延长生命周期。它返回的是执行瞬间的快照查询之后字段仍可能因到期、HSET 覆盖清除 TTL、HDEL 删除或 HPERSIST 而改变状态。若后续操作依赖该结果应把检查与修改放进脚本或事务设计。六、Python 客户端示例前提为已安装 redis-py 且服务端为 Redis 7.4 或更新版本。importredis rredis.Redis(hostlocalhost,port6379,decode_responsesTrue)ktutorial:{hpexpiretime}:pythontry:r.delete(k)r.hset(k,mapping{a:A,b:B})fields[a,b,missing]print(r.execute_command(HPEXPIRETIME,k,FIELDS,len(fields),*fields))# [-1, -1, -2]r.execute_command(HEXPIRE,k,300,FIELDS,2,a,b)rawr.execute_command(HPEXPIRETIME,k,FIELDS,len(fields),*fields)forname,valueinzip(fields,raw):ifvalue-2:print(name,不存在)elifvalue-1:print(name,永久有效)else:print(name,到期时间戳毫秒,value)finally:r.delete(k)r.close()七、典型场景与性能适合在排障时确认字段是否真的带有期限、核对缓存续期是否符合预期、把字段到期时刻导出给监控系统。由于是只读命令对生产实例副作用很小但仍会占用一次请求与少量服务端时间。复杂度为 O(N)N 是查询的字段数量不随 Hash 总大小增长。批量查询同一 Hash 的多个字段应放在一条命令中而不是循环调用跨多个 Hash 查询时可用 Pipeline 减少往返但结果不构成同一时刻的一致快照。八、练习、排错与总结练习新建tutorial:{hpexpiretime}:exercise写入 a1、b2查询两个字段预期[-1, -1]用HPEXPIRE ... 300000 FIELDS 1 a设置毫秒 TTL 后再次查询预期 a 为 13 位毫秒时间戳、b 为 -1执行HPERSIST ... FIELDS 1 a后再查询预期回到[-1, -1]。排错要点返回 -1 说明字段永久有效而非不存在返回 -2 说明字段或 Key 不存在可用 HEXISTS 与 EXISTS 区分数值只有 10 位说明用的是秒级命令应确认使用的是 HPEXPIRETIME 而不是 HEXPIRETIMEunknown command 时检查服务端版本不低于 7.4客户端报整数溢出说明未按 64 位解析。清理使用DEL tutorial:{hpexpiretime}:profile tutorial:{hpexpiretime}:missing tutorial:{hpexpiretime}:exercise。速记7.4 起支持、只读、FIELDS 必填、-1 表示永久、-2 表示不存在、返回毫秒级绝对时间戳。