HKEYS / HVALS 是什么
两个命令分别返回 Hash 的全部字段名与全部字段值,顺序与 HGETALL 一致(即字段名与值可以按下标对应)。它们都是全量读取,复杂度 O(N):字段越多,一次调用返回的数据量与阻塞风险越大。只需要「有哪些字段」时用 HKEYS 就够,只需要值时可考虑用 HVALS,能省一半带宽。
基本信息
| 适用版本 | Redis 全版本(HashRedis 基础命令) |
|---|---|
| HKEYS | 返回所有字段名 |
| HVALS | 返回所有字段值,与 HKEYS 同序 |
| 复杂度 | O(N),N 为字段数,均为同步阻塞执行 |
| 返回格式 | 数组;键不存在时返回空数组 |
| 配套命令 | HLEN 看规模、HSCAN 增量遍历、HMGET 定向取值 |
典型使用场景
- 字段结构核查:确认某类对象的字段集合是否符合预期
- 导出数据:把整个 Hash 的值取出来落库或转存
- 配置变更巡检:批量读取配置类 Hash 的全部值做比对
- 数据修复:先取全量值,逐字段校验后再定向修改
- 小 Hash 的快速展示:字段数不多时全量读取最省事
示例与替代写法
示例与替代写法
HKEYS user:1001 # name age city
HVALS user:1001 # 张三 31 上海
HGETALL user:1001 # 字段名与值成对返回,需要成对时用它
HLEN user:1001 # 先看规模,决定是否全量读取
HSCAN user:1001 0 MATCH addr* COUNT 100 # 定向找前缀字段
HMGET user:1001 name city # 只要指定字段
# 大 Hash 上避免周期性全量读取:用 HSCAN 游标遍历
HSCAN user:1001 0 COUNT 200命令选择对照
| 需求 | 命令 | 代价 |
|---|---|---|
| 只要字段名 | HKEYS | O(N),返回一半数据量 |
| 只要字段值 | HVALS | O(N),返回一半数据量 |
| 成对使用 | HGETALL | O(N),两次数据都返回 |
| 看规模 | HLEN | O(1),判断是否能全量读 |
| 大 Hash 遍历 | HSCAN 游标 | 分批非阻塞,适合生产环境 |
需要「字段名 + 值」成对使用时用 HGETALL;只取单边时用 HKEYS 或 HVALS 可以少传一半数据。字段数量是决策依据:先 HLEN 再选择命令,能避免对大 Hash 做全量读取。
Redis 单线程执行命令,全量读取大 Hash 会阻塞其他请求:在一个几十万字段的 Hash 上执行 HKEYS,可能造成毫秒级到秒级的命令堆积,生产环境请改用 HSCAN 分批遍历。