ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Redis命令:HGETEX

Redis命令:HGETEX Redis HGETEX 命令详细教程HGETEX读取 Hash 中一个或多个字段的值并可在同一条命令中设置或清除这些字段的过期时间。它从 Redis 8.0.0 起提供是“读取加续期”的原子组合。资料合集https://pan.quark.cn/s/10e98d308913、https://pan.quark.cn/s/f56bc69c5338一、概览与语法HGETEX key [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | PERSIST] FIELDS numfields field [field ...]项目说明数据类型Hash支持版本Redis 8.0.0 起key一个 Hash Key过期选项EX、PX、EXAT、PXAT、PERSIST 五者最多选一也可以完全不写FIELDS必填关键字不可省略numfields字段数量必须与后续字段参数个数一致返回值值数组顺序与输入字段一致缺失字段对应空值时间复杂度O(N)N 为指定字段数量ACLwrite、hash、fast命令标记write不写任何过期选项时HGETEX 的行为接近按指定字段读取不修改任何 TTL。命令会修改字段的过期时间因此被标记为写命令不能用在只读副本或只读连接上。$TRAE_REF二、过期选项语义五个选项互斥不能组合使用。选项含义EX seconds从现在起经过指定秒数后到期PX milliseconds从现在起经过指定毫秒数后到期EXAT unix-time-seconds在指定 Unix 秒级时间戳到期PXAT unix-time-milliseconds在指定 Unix 毫秒级时间戳到期PERSIST移除字段已有的过期时间使其变为永久字段不写保持字段现有 TTL 不变EXAT 与 PXAT 的时间戳若已过去字段会立即被删除此时返回值仍然包含被删除前的值因为读取发生在删除之前。三、基础示例以下命令需要 Redis 8.0 或更新版本在测试实例的 redis-cli 中执行。文中结果是预期说明未实际连接 Redis 运行。DEL tutorial:{hgetex}:session HSET tutorial:{hgetex}:session token abc user u100 theme dark HGETEX tutorial:{hgetex}:session EX 120 FIELDS 1 token HGETEX tutorial:{hgetex}:session EX 100 FIELDS 1 user HTTL tutorial:{hgetex}:session FIELDS 3 token user theme HGETEX tutorial:{hgetex}:session FIELDS 2 theme absent HGETEX tutorial:{hgetex}:session PERSIST FIELDS 1 token HTTL tutorial:{hgetex}:session FIELDS 1 token预期结果前两次 HGETEX 分别返回[abc]与[u100]HTTL 返回形如[91, 85, -1]的数组token 与 user 是递减的剩余秒数theme 为 -1 表示没有 TTL不带选项的 HGETEX 返回[dark, nil]即 theme 的值与 absent 的空值且不改变任何 TTLPERSIST 后 token 的 HTTL 变为 -1。示例中的秒数会随执行时刻变化因此只描述形态不给出固定数字。四、不创建字段与空值处理HGETEX 是读取语义不会创建不存在的 Key 或字段也不会为缺失字段设置过期时间。缺失字段在返回值中占据一个位置内容为空值长度始终等于请求的字段数量。场景行为Key 不存在按输入字段数返回多个空值不创建 Key不设置任何 TTL字段不存在该项返回空值该字段不会被创建也不会产生 TTL字段值为空字符串返回空字符串字段存在可按选项设置 TTLKey 是 String、List 等非 Hash报 WRONGTYPE 错误选项写多个或未知选项报语法错误numfields 与实际字段数不符报语法错误只关心存在字段的续期时应先用 HEXISTS 过滤或接受缺失字段返回空值的事实。五、与相近命令的区别命令读取修改 TTL删除起始版本HGET单字段否否2.0HMGET多字段否否2.0HEXPIRE否是相对秒否7.4HPERSIST否清除否7.4HGETEX多字段是否8.0HGETDEL多字段否是8.0GETEX单 KeyString是否6.2HGETEX 可以看作 Hash 版本的 GETEX它把“取值”和“续期”合并避免先 HGET 再 HEXPIRE 的两次往返与竞态窗口。如果只是单纯读值、不需要改 TTL用 HMGET 更直观也不必让只读实例承担写命令。六、典型场景缓存命中续期滑动过期缓存是 HGETEX 最典型的使用方式命中时读取值并把 TTL 重置为完整周期未命中时由业务回源并重新写入。处理一次请求 1. HGETEX cache:{user}:profile EX 600 FIELDS 3 name level avatar 2. 若返回的值中包含空值说明对应字段缺失或已过期需要回源 3. 回源后使用 HSET 写入并配合 HEXPIRE 设置字段 TTL注意续期与回源不是同一个原子操作HGETEX 只保证“读取加续期”这一步原子回源与写回仍在命令之外多个并发请求可能同时回源。高并发场景可配合互斥锁或允许短暂重复回源。另外给字段设置 TTL 意味着字段会独立消失业务需要能容忍字段级的缺失而不是只依赖整个 Key 的过期。七、并发、原子性与重试HGETEX 对多个字段是原子执行的返回值来自执行瞬间的一致快照不会读到“改了一半”的 TTL 状态。但“先 HGETEX 判断再写入”仍是跨命令流程其他客户端可能在两次调用之间修改数据。使用相对时间选项EX、PX时重试会从新的时刻重新计时可能无意延长有效期需要固定截止时间时应使用 EXAT 或 PXAT。请求超时也不代表未执行重发前可先用 HEXPIRETIME 或 HTTL 检查字段当前状态。单条命令会一次性修改多个字段的 TTL字段数量多时注意控制批次大小避免单次请求过大。八、Python 客户端示例前提为已安装 redis-py 且服务端为 Redis 8.0 或更新版本。使用通用接口显式展示 FIELDS 语法。importredis rredis.Redis(hostlocalhost,port6379,decode_responsesTrue)ktutorial:{hgetex}:pythontry:r.delete(k)r.hset(k,mapping{token:abc,user:u100,theme:dark})print(r.execute_command(HGETEX,k,EX,120,FIELDS,1,token))# [abc]fields[token,theme,absent]valuesr.execute_command(HGETEX,k,FIELDS,len(fields),*fields)print(values)# [abc, dark, None]print(r.execute_command(HTTL,k,FIELDS,3,*fields))# [约120, -1, -2]print(r.execute_command(HGETEX,k,PERSIST,FIELDS,1,token))# [abc]print(r.execute_command(HTTL,k,FIELDS,1,token))# [-1]finally:r.delete(k)r.close()九、练习、排错与总结练习新建tutorial:{hgetex}:exercise写入 a1、b2执行HGETEX ... EX 300 FIELDS 2 a b预期返回1、2用 HTTL 确认两个字段都有正数剩余时间再执行HGETEX ... PERSIST FIELDS 1 a预期 HTTL 对 a 返回 -1最后执行HGETEX ... EXAT 1 FIELDS 1 b预期返回2但 b 随即被删除HEXISTS 为 0。排错要点unknown command 时确认服务端版本不低于 8.0报错时检查是否同时写了两个过期选项返回空值说明字段不存在或已过期可用 HEXISTS 与 HTTL 区分HTTL 返回 -1 表示字段永久有效-2 表示字段不存在写入后 TTL 意外消失检查是否随后用 HSET 覆盖了该字段。清理使用DEL tutorial:{hgetex}:session tutorial:{hgetex}:exercise。速记8.0 起支持、读取同时可选续期、五个过期选项互斥、不创建缺失字段、相对时间重试会重新计时。
返回列表