Redis中的Hash类型是一种键值对集合,其中值本身又是一个键值对映射,非常适合存储对象类型的数据,Hash类型在Redis中采用ziplist或hashtable两种编码方式,当哈希表元素数量较少且元素值较小时,ziplist会更为高效;当元素数量增多或值变大时,Redis会自动转换为hashtable编码以保证查询性能,以下是Redis Hash类型的常用命令及其详细说明,涵盖基本操作、批量操作、计数器、扫描等场景。

基本操作命令
-
HSET key field value
用于将哈希表key中的field字段值设置为value,如果key不存在,会创建一个新的哈希表;如果field已存在,则覆盖其值。HSET user:1 name Alice,结果为成功设置字段name的值为Alice,该命令返回1表示新字段被创建,0表示已存在字段被覆盖。 -
HGET key field
获取哈希表中指定字段的值,若key或field不存在,返回nil。HGET user:1 name,返回"Alice"。 -
HGETALL key
返回哈希表中所有字段和值,结果以[field, value, field, value]的格式返回,当哈希表较大时,此命令会占用较多网络带宽,建议谨慎使用。HGETALL user:1,可能返回["name", "Alice", "age", "25"]。 -
HDEL key field [field ...]
删除哈希表中的一个或多个字段,若字段不存在,会被忽略;若key不存在,视为空哈希表,返回成功删除的字段数量。HDEL user:1 age email,若age存在而email不存在,则返回1。
(图片来源网络,侵删) -
HEXISTS key field
检查字段是否存在,存在返回1,否则返回0。HEXISTS user:1 name,返回1。
批量操作命令
-
HMSET key field value [field value ...]
批量设置多个字段的值,Redis 4.0后已不推荐使用,建议改用HSET的多个参数形式(如HSET key field1 value1 field2 value2),功能相同且语法更简洁。 -
HMGET key field [field ...]
批量获取多个字段的值,返回一个包含所有字段值的列表,不存在的字段对应位置为nil。HMGET user:1 name age email,返回["Alice", "25", nil]。
计数器与数值操作
-
HINCRBY key field increment
将字段值加上指定的整数值增量(可为负数),若字段不存在,先初始化为0再 increment;若字段值不是整数,返回错误。HINCRBY user:1 score 5,若score原值为10,则返回15。
(图片来源网络,侵删) -
HINCRBYFLOAT key field increment
功能同HINCRBY,但支持浮点数增量,若字段不存在,初始化为0.0;若字段值无法解析为浮点数,返回错误。HINCRBYFLOAT user:1 gpa 0.1,若gpa原值为3.5,则返回3.6。
其他实用命令
-
HKEYS key
返回哈希表中所有字段名,结果无序。HKEYS user:1,返回["name", "age"]。 -
HVALS key
返回哈希表中所有字段值,结果无序。HVALS user:1,返回["Alice", "25"]。 -
HLEN key
返回哈希表中字段的数量。HLEN user:1,返回2。 -
HSTRLEN key field
返回字段值的字符串长度,若字段不存在,返回0。HSTRLEN user:1 name,返回"Alice"的长度5。 -
HSCAN key cursor [MATCH pattern] [COUNT count]
增量式遍历哈希表,避免阻塞Redis,cursor初始为0,每次遍历返回新的cursor,当cursor为0时遍历结束,MATCH支持模式匹配字段名,COUNT建议设为100左右。HSCAN user:1 0 MATCH a* COUNT 2,返回新的cursor和匹配"a"开头的字段列表。
命令使用场景示例
以下是一个简化的命令执行表,展示对用户信息的操作:
| 命令 | 执行结果 | 说明 |
|---|---|---|
| HSET user:1 name Bob | (integer) 1 | 创建字段name并赋值Bob |
| HSET user:1 age 30 | (integer) 1 | 创建字段age并赋值30 |
| HGETALL user:1 | 1) "name" 2) "Bob" 3) "age" 4) "30" | 获取所有字段和值 |
| HINCRBY user:1 age 1 | (integer) 31 | age字段加1 |
| HDEL user:1 age | (integer) 1 | 删除age字段 |
| HGET user:1 age | (nil) | age字段已不存在 |
相关问答FAQs
Q1: Hash类型和String类型存储对象数据时,如何选择?
A1: 当对象的字段较少(如10个以内)且字段值较小时(如小于1KB),String类型(使用JSON序列化)可能更简单;若字段较多或需要频繁操作单个字段(如更新某个属性),Hash类型更高效,因其支持按字段操作,减少数据序列化/反序列化开销,Hash的内存占用在字段少时可能更优,因ziplist编码更紧凑。
Q2: 使用HGETALL遍历大哈希表时,如何避免阻塞Redis?
A2: 大哈希表(如字段超过1000)应避免使用HGETALL,改用HSCAN进行增量遍历,HSCAN通过游标分批返回数据,每次只处理少量字段,降低CPU和网络负载,可结合MATCH参数过滤字段,COUNT参数控制每次返回的数量(默认10,建议100-500),并在业务代码中循环处理直到cursor为0。
