
Redis HKEYS 命令详细教程HKEYS返回 Hash 中全部字段名不包含字段值。它是只读命令耗时随 Hash 大小线性增长官方标记为慢命令。资料合集https://pan.quark.cn/s/10e98d308913、https://pan.quark.cn/s/f56bc69c5338一、概览与语法HKEYS key项目说明数据类型Hash支持版本Redis 2.0.0 起key一个 Hash Key返回值字段名数组Key 不存在时为空数组时间复杂度O(N)N 为 Hash 的字段数量ACLread、hash、slow命令标记readonly官方明确标注该命令输出顺序不确定nondeterministic output order并归类为slow。$TRAE_REF二、基础示例以下命令在测试实例的 redis-cli 中执行。文中结果是预期说明未实际连接 Redis 运行。DEL tutorial:{hkeys}:user tutorial:{hkeys}:missing HSET tutorial:{hkeys}:user name Alice city Shanghai age 30 HKEYS tutorial:{hkeys}:user HLEN tutorial:{hkeys}:user HKEYS tutorial:{hkeys}:missing EXISTS tutorial:{hkeys}:missing预期结果HKEYS 返回 3 个字段名形如name city age但实际排列顺序可能不同HLEN 返回3对缺失 Key 调用返回空数组且不创建 KeyEXISTS 为0。返回的只有字段名没有对应的值。需要同时拿到值和字段名时应使用 HGETALL只需要值时使用 HVALS。三、输出顺序与结果解析Redis 不承诺 HKEYS 的字段顺序。小型 Hash 常表现为插入顺序或内部编码顺序但这是实现细节不能作为业务依据。需要固定顺序时应在客户端排序。RESP2 与 RESP3 都返回数组不存在“映射”形态这一点与 HGETALL 不同命令RESP2RESP3HKEYS字段名数组字段名数组HVALS值数组值数组HGETALL字段与值交替数组映射因此客户端对 HKEYS 的解码结果始终是列表或集合不会自动变成字典。用 Python 的集合运算可以方便地做字段名对比before{name,city,age}after{name,age,email}print(before-after)# {city}被删除的字段print(after-before)# {email}新增的字段四、缺失 Key、空值与错误类型场景行为Key 不存在返回空数组不报错不创建 KeyKey 已到期视作不存在返回空数组Hash 存在但字段全部被删除或到期最后一个字段消失时 Key 被删除通常表现为 Key 不存在Key 是 String、List 等非 Hash报 WRONGTYPE 错误字段值为空字符串该字段名正常返回HKEYS 不关心值的内容字段名是空字符串正常返回该字段名DEL tutorial:{hkeys}:empty HSET tutorial:{hkeys}:empty blank flag HKEYS tutorial:{hkeys}:empty SET tutorial:{hkeys}:wrong text HKEYS tutorial:{hkeys}:wrong第二次调用返回 2 个字段名其中一个是空字符串字段名说明字段值为空或字段名本身为空都不影响它被列出。最后一条命令报 WRONGTYPE。由于 Redis 中不存在零字段的 Hash返回空数组只有一种解释Key 不存在或已到期。需要进一步确认时使用 EXISTS。五、大 Hash 的性能风险HKEYS 的时间复杂度是 O(N)并且会把所有字段名一次性传输到客户端。字段数量极大时会造成服务端阻塞风险、网络带宽占用和客户端内存压力官方标记为slow正是基于这一点。场景建议方式只需要字段数量HLENO(1)只需要字段值HVALS需要字段名和值HGETALL但要先评估规模需要遍历大 HashHSCAN增量游标遍历只判断某字段是否存在HEXISTS需要少量已知字段的值HMGETHKEYS 传输的数据量小于 HGETALL因为不含值但仍与字段数量成正比不能当作“轻量命令”在大 Key 上高频调用。线上排查大 Key 时优先使用 HLEN 或 MEMORY USAGE。六、客户端示例前提为已安装 redis-py 并准备好本地测试实例。importredis rredis.Redis(hostlocalhost,port6379,decode_responsesTrue)ktutorial:{hkeys}:pythontry:r.delete(k)r.hset(k,mapping{name:Alice,age:30,empty:})fieldsr.hkeys(k)print(fields)# [name, age, empty]顺序不保证print(sorted(fields))# [age, empty, name]需要稳定顺序时自行排序print(len(fields))# 3print(r.hkeys(tutorial:{hkeys}:missing))# []finally:r.delete(k)r.close()JavaJedis示例返回 Settry(JedisjedisnewJedis(localhost,6379)){jedis.hset(tutorial:{hkeys}:java,name,Alice);jedis.hset(tutorial:{hkeys}:java,age,30);SetStringfieldsjedis.hkeys(tutorial:{hkeys}:java);System.out.println(fields);jedis.del(tutorial:{hkeys}:java);}注意 Jedis 返回 Set说明该客户端也不保证顺序如果业务依赖顺序应在应用层排序。七、原子性、一致性与典型用途单条 HKEYS 是原子的返回的是执行瞬间的一致快照不会读到“写了一半”的字段集合。但“先 HKEYS 判断再对字段批量操作”是跨命令流程两次调用之间其他客户端可能新增或删除字段。需要按字段集合做条件操作时应使用 Lua 脚本或带 WATCH 的事务设计而不是依赖客户端预检查。典型用途字段名对比与审计、导出 Hash 结构、判断某个字段是否被删除、为批量 HDEL 或 HMGET 生成字段列表。由于字段名可能包含特殊字符把 HKEYS 结果拼接成其他命令参数时应正确转义并注意不要用管道符或空格做分隔。八、练习、排错与总结练习新建tutorial:{hkeys}:exercise写入 a1、b2、c3执行 HKEYS 并确认返回 3 个字段名执行HDEL ... b后再次执行 HKEYS确认只剩 2 个且不含 b最后用DEL删除 Key 后执行 HKEYS预期得到空数组且 EXISTS 为 0。排错要点返回空数组时先用 EXISTS 确认 Key 是否存在报 WRONGTYPE 时用 TYPE 检查类型结果顺序与预期不同属正常现象不应依赖顺序返回的字段数少于预期时检查是否有字段已到期Redis 7.4 及以上支持字段级 TTL字段名出现乱码时检查客户端编码设置。清理使用DEL tutorial:{hkeys}:user tutorial:{hkeys}:missing tutorial:{hkeys}:empty tutorial:{hkeys}:wrong tutorial:{hkeys}:exercise。速记只返回字段名、O(N) 慢命令、顺序不保证、缺失 Key 返回空数组、大 Hash 优先用 HSCAN。