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,建议在数据访问层把字段名统一定义为常量,避免散落的字符串。