首页/数据/数据库速查/HGET / HMGET 读取字段
Redis 命令96 条

HGET / HMGET 读取字段

单字段用 HGET,多字段用 HMGET:不存在的字段返回 nil 且位置保留,便于按序对号入座;键整体不存在时 HMGET 全 nil。

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

HGET / HMGET 是什么

HGET 读取 Hash 里的单个字段,HMGET 一次读取多个字段:不存在的字段返回 nil 且位置保留,便于按字段顺序对号入座;键整体不存在时 HMGET 每个位置也都是 nil,不会报错。对 String 类型的键使用 HGET 会直接报 WRONGTYPE,这是排障时很常见的误用。

基本信息

适用版本Redis 全版本
语法HGET key field / HMGET key field [field ...]
返回值单值;HMGET 为数组,缺失字段位置为 nil
复杂度单字段 O(1),HMGET 为 O(N)
相关命令HSET / HGETALL / HEXISTS / HINCRBY / HLEN

典型使用场景

  • 读对象的部分字段:只取页面需要的几项,避免整对象传输
  • 同一对象多字段读取:用 HMGET 一次往返拿全
  • 计数型字段:HINCRBY 累加,再用 HGET 查看当前值
  • 存在性判断:HEXISTS 判断字段是否设置过,避免把 nil 当默认值
  • 容量体检:HLEN 看字段数量,识别过度膨胀的 Hash
  • 接口兼容:字段增删时按字段名读取,保持向前兼容

示例

示例
HGET user:1001 name        # 返回 张三
HMGET user:1001 name missing age   # 返回 1) 张三  2) (nil)  3) 31
EXISTS user:1001           # 返回 1,判断键是否存在
HEXISTS user:1001 age      # 返回 1,判断字段是否存在
HGET user:nobody name      # 返回 (nil),键不存在也不报错
HINCRBY user:1001 points 10 # 返回累加后的分数
HLEN user:1001             # 字段数量,字段过多要考虑拆键

命令对照

命令作用注意点
HGET读单字段对 String 键会报 WRONGTYPE
HMGET读多字段返回数组长度与请求字段数一致
HGETALL读全部字段字段多时返回体积大,慎用
HEXISTS判断字段是否存在与判断键是否存在要区分开
HINCRBY字段值整型累加字段值非整数会报错
需要读多个字段时用 HMGET 一次往返,比循环 HGET 节省 RTT;但字段极多反而应重新拆键。
字段数上万的大 Hash 不要用 HGETALL:返回体积大且回收与传输都在主线程上完成,改成分批 HMGET,或把对象按业务维度拆成多个键。
HMGET 的结果顺序与请求字段顺序严格一致,可以按位置取值;但字段名拼错只会静默返回 nil,建议在数据访问层把字段名统一定义为常量,避免散落的字符串。

易错点

  • 把不存在的字段当成「值为空字符串」,业务逻辑误判导致数据被覆盖
  • 对 String 键调用 HGET 报 WRONGTYPE,说明数据结构设计已漂移
  • 用 HGETALL 取大对象,单次返回几十 MB 造成网络与主线程阻塞
  • 循环 HGET 读多个字段,往返次数放大延迟,应用层响应变慢
  • 把 Hash 当成宽表无限加字段,缺少字段下线机制导致内存持续增长

数据来源与参考

  • Redis 官方文档: HGET
  • Redis 官方文档: HMGET

相关工具

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