Hash 型 Value 操作命令

11/26/2023 缓存Redis

Redis 存储数据的 Value 可以是一个 Hash 类型。Hash 类型也称为 Hash 表、字典等。
Hash 表就是一个映射表 Map,也是由键-值对构成,为了与整体的 key 进行区分,这里的键称为 field,值称为 value。注意,Redis 的 Hash 表中的 field-value 对均为 String 类型。

# 一、hset

● 格式:HSET key field value
● 功能:将哈希表 key 中的域 field 的值设为 value。
● 说明:如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0。

# 二、hget

● 格式:HGET key field
● 功能:返回哈希表 key 中给定域 field 的值。
● 说明:当给定域不存在或是给定 key 不存在时,返回 nil。

# 三、hmset

● 格式:HMSET key field value [field value ...]
● 功能:同时将多个 field-value (域-值)对设置到哈希表 key 中。
● 说明:此命令会覆盖哈希表中已存在的域。如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。如果命令执行成功,返回 OK。当 key 不是哈希表(hash)类型时,返回一个错误。

# 四、hmget

● 格式:HMGET key field [field ...]
● 功能:按照给出顺序返回哈希表 key 中一个或多个域的值。
● 说明:如果给定的域不存在于哈希表,那么返回一个 nil 值。因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。

# 五、hgetall

● 格式:HGETALL key
● 功能:返回哈希表 key 中所有的域和值。
● 说明:在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。若 key 不存在,返回空列表。若 key 中包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中一般不使用该命令,而使用 hscan 命令代替。

# 六、hsetnx

● 格式:HSETNX key field value
● 功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。
● 说明:若域 field 已经存在,该操作无效。如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。

# 七、hdel

● 格式:HDEL key field [field ...]
● 功能:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
● 说明:返回被成功移除的域的数量,不包括被忽略的域。

# 八、hexits

● 格式:HEXISTS key field
● 功能:查看哈希表 key 中给定域 field 是否存在。
● 说明:如果哈希表含有给定域,返回 1 。如果不含有给定域,或 key 不存在,返回 0。

# 九、hincrby 与 hincrbyfloat

● 格式:HINCRBY key field increment
● 功能:为哈希表 key 中的域 field 的值加上增量 increment 。hincrby 命令只能增加整数值,而 hincrbyfloat 可以增加小数值。
● 说明:增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0。对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。

# 十、hkeys 与 hvals

● 格式:HKEYS key 或 HVALS key
● 功能:返回哈希表 key 中的所有域/值。
● 说明:当 key 不存在时,返回一个空表。

# 十一、hlen

● 格式:HLEN key
● 功能:返回哈希表 key 中域的数量。
● 说明:当 key 不存在时,返回 0。

# 十二、hstrlen

● 格式:HSTRLEN key field
● 功能:返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。
● 说明:如果给定的键或者域不存在, 那么命令返回 0 。

# 十三、应用场景

Hash 型 Value 非常适合存储对象数据。key 为对象名称,value 为描述对象属性的 Map,对对象属性的修改在Redis 中就可直接完成。其不像String 型 Value 存储对象,那个对象是序列化过的,例如序列化为 JSON 串,对对象属性值的修改需要先反序列化为对象后再修改,修改后再序列化为JSON 串后写入到 Redis。