首页/数据/数据库速查/HGETALL 全量读取哈希
Redis 命令96 条

HGETALL 全量读取哈希

一次取回所有 field-value;字段多时结果集会很大且阻塞单线程,生产建议用 HSCAN 分批或只取需要的字段。

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

HGETALL 是什么

HGETALL 一次取回 Hash 里所有字段与值,返回结果中字段名与值交替出现。它的风险全在「全量」两个字上:如果这个 Hash 有几万个字段,一次调用就会生成很大的响应包,序列化与网络传输都会占用单线程的处理时间,成为延迟毛刺的直接来源。字段多时应当用 HSCAN 分批读取,或者只用 HMGET 取真正需要的几个字段。

基本信息

语法HGETALL key
返回字段与值交替出现的数组
等价写法HKEYS 加 HVALS,但需要两次往返
风险大 Hash 全量读取会阻塞单线程并撑大响应包
替代方案HSCAN 游标分批,或 HMGET 只取指定字段

典型使用场景

  • 读取字段很少、访问频繁的配置类 Hash
  • 调试时查看某个对象当前的全部内容
  • 数据巡检,确认字段有没有异常增删
  • 评估某个大 Hash 的字段规模,决定读取方式
  • 对比 HSCAN 与 HGETALL 在同一数据上的耗时差异

读取与替代写法

读取与替代写法
HGETALL user:1001
# 1) "name"  2) "张三"  3) "age"  4) "31"   字段与值交替
HLEN user:1001                 # 先看字段数量,再决定怎么读
HSCAN user:1001 0 COUNT 50     # 字段多时用游标分批遍历
HMGET user:1001 name age       # 只要几个字段就别全量读
HKEYS user:1001                # 只取字段名,大 Hash 下同样危险

按规模选读法

字段规模是否可直接全量读替代方案
几十个以内可以直接 HGETALL简单直接,无需额外处理
数百个谨慎评估用 HMGET 只取需要的字段
上万个不要全量读取改用 HSCAN 分批遍历
需要全部字段名看规模HKEYS 或 HSCAN,注意阻塞风险
需要全部值与全量读取等价HVALS 的代价与 HGETALL 相当
把 HGETALL 当默认读法是危险的:单个 Hash 有几万字段时,一次调用的序列化与传输耗时就是线上毛刺的来源,而这类问题通常在流量上涨之后才暴露。
客户端库通常把 HGETALL 的结果封装成 map,字段顺序不再重要;但如果直接使用返回数组,就必须按「字段、值交替」的规则解析,不能按下标猜语义。
判断能否安全全量读取,要同时看字段数量与值的平均长度:字段不多但每个值都很大时,响应包同样会很大,只看字段数量会低估风险。

易错点

  • 对几万字段的 Hash 直接 HGETALL:网络带宽与单线程阻塞双双受损
  • HGETALL 之后按数组下标取值:客户端实现差异可能让顺序假设失效
  • 用 HKEYS 取字段名再逐个 HGET:往返次数被放大,比一次读取更慢
  • 只看字段数量不看值的长度:响应包大小被严重低估

数据来源与参考

  • Redis 官方文档: HGETALL
  • Redis 官方文档: HSCAN

相关工具

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