菜鸟科技网

Redis的hash命令有哪些常用操作?

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

Redis的hash命令有哪些常用操作?-图1
(图片来源网络,侵删)

基本操作命令

  1. HSET key field value
    用于将哈希表key中的field字段值设置为value,如果key不存在,会创建一个新的哈希表;如果field已存在,则覆盖其值。HSET user:1 name Alice,结果为成功设置字段name的值为Alice,该命令返回1表示新字段被创建,0表示已存在字段被覆盖。

  2. HGET key field
    获取哈希表中指定字段的值,若key或field不存在,返回nil。HGET user:1 name,返回"Alice"。

  3. HGETALL key
    返回哈希表中所有字段和值,结果以[field, value, field, value]的格式返回,当哈希表较大时,此命令会占用较多网络带宽,建议谨慎使用。HGETALL user:1,可能返回["name", "Alice", "age", "25"]。

  4. HDEL key field [field ...]
    删除哈希表中的一个或多个字段,若字段不存在,会被忽略;若key不存在,视为空哈希表,返回成功删除的字段数量。HDEL user:1 age email,若age存在而email不存在,则返回1。

    Redis的hash命令有哪些常用操作?-图2
    (图片来源网络,侵删)
  5. HEXISTS key field
    检查字段是否存在,存在返回1,否则返回0。HEXISTS user:1 name,返回1。

批量操作命令

  1. HMSET key field value [field value ...]
    批量设置多个字段的值,Redis 4.0后已不推荐使用,建议改用HSET的多个参数形式(如HSET key field1 value1 field2 value2),功能相同且语法更简洁。

  2. HMGET key field [field ...]
    批量获取多个字段的值,返回一个包含所有字段值的列表,不存在的字段对应位置为nil。HMGET user:1 name age email,返回["Alice", "25", nil]。

计数器与数值操作

  1. HINCRBY key field increment
    将字段值加上指定的整数值增量(可为负数),若字段不存在,先初始化为0再 increment;若字段值不是整数,返回错误。HINCRBY user:1 score 5,若score原值为10,则返回15。

    Redis的hash命令有哪些常用操作?-图3
    (图片来源网络,侵删)
  2. HINCRBYFLOAT key field increment
    功能同HINCRBY,但支持浮点数增量,若字段不存在,初始化为0.0;若字段值无法解析为浮点数,返回错误。HINCRBYFLOAT user:1 gpa 0.1,若gpa原值为3.5,则返回3.6。

其他实用命令

  1. HKEYS key
    返回哈希表中所有字段名,结果无序。HKEYS user:1,返回["name", "age"]。

  2. HVALS key
    返回哈希表中所有字段值,结果无序。HVALS user:1,返回["Alice", "25"]。

  3. HLEN key
    返回哈希表中字段的数量。HLEN user:1,返回2。

  4. HSTRLEN key field
    返回字段值的字符串长度,若字段不存在,返回0。HSTRLEN user:1 name,返回"Alice"的长度5。

  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。

分享:
扫描分享到社交APP
上一篇
下一篇