首页/数据/数据库速查/HKEYS / HVALS 取字段名与值
Redis 命令96 条

HKEYS / HVALS 取字段名与值

分别返回全部字段名或全部值;字段多时与大 Hash 全量读同样有阻塞风险,按需 HSCAN 或 HMGET 定向取。

数据库速查数据更新于 2026-10-13

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

命令选择对照

需求命令代价
只要字段名HKEYSO(N),返回一半数据量
只要字段值HVALSO(N),返回一半数据量
成对使用HGETALLO(N),两次数据都返回
看规模HLENO(1),判断是否能全量读
大 Hash 遍历HSCAN 游标分批非阻塞,适合生产环境
需要「字段名 + 值」成对使用时用 HGETALL;只取单边时用 HKEYS 或 HVALS 可以少传一半数据。字段数量是决策依据:先 HLEN 再选择命令,能避免对大 Hash 做全量读取。
Redis 单线程执行命令,全量读取大 Hash 会阻塞其他请求:在一个几十万字段的 Hash 上执行 HKEYS,可能造成毫秒级到秒级的命令堆积,生产环境请改用 HSCAN 分批遍历。

易错点

  • 对大 Hash 周期性执行 HKEYS 做监控:每次全量扫描,慢查询名单常客
  • 依赖 HVALS 与 HKEYS 的顺序严格对齐做 zip:当前实现同序,但语义未承诺,稳妥做法是用 HGETALL 或 HSCAN
  • 键不存在时把空数组当异常:应区分「键不存在」与「Hash 为空」两种情况
  • 在 Lua 脚本里做全量 HKEYS:脚本执行期间其他命令全部阻塞,风险被进一步放大
  • 以为 HKEYS 可以按模式过滤:过滤应在客户端做或用 HSCAN 的 MATCH,全量拉取后再筛是浪费

数据来源与参考

  • Redis 官方文档: HKEYS
  • Redis 官方文档: HVALS

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌