3.4Hash 型 Value 操作命令
Redis 存储数据的 Value 可以是一个 Hash 类型。 Hash 类型也称为 Hash 表、字典等。 Hash 表就是一个映射表 Map,也是由键-值对构成,为了与整体的 key 进行区分,这里 的键称为 field,值称为 value。注意,Redis 的 Hash 表中的 field-value 对均为 String 类型。
3.4.1 hset
格式:HSET key field value 功能:将哈希表 key 中的域 field 的值设为 value 。 说明:如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已 经存在于哈希表中,旧值将被覆盖。如果 field 是哈希表中的一个新建域,并且值设置 成功,返回 1 。 如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。
3.4.2 hget
格式:HGET key field 功能:返回哈希表 key 中给定域 field 的值。 说明:当给定域不存在或是给定 key 不存在时,返回 nil 。
3.4.3 hmset
格式:HMSET key field value [field value ...] 功能:同时将多个 field-value (域-值)对设置到哈希表 key 中。 说明:此命令会覆盖哈希表中已存在的域。如果 key 不存在,一个空哈希表被创建并 执行 HMSET 操作。如果命令执行成功,返回 OK 。当 key 不是哈希表(hash)类型时, 返回一个错误。
3.4.4 hmget
格式:HMGET key field [field ...]
功能:按照给出顺序返回哈希表 key 中一个或多个域的值。
说明:如果给定的域不存在于哈希表,那么返回一个 nil 值。因为不存在的 key 被当 作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带 有 nil 值的表。
3.4.5 hgetall
格式:HGETALL key 功能:返回哈希表 key 中所有的域和值。 说明:在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度 是哈希表大小的两倍。若 key 不存在,返回空列表。若 key 中包含大量元素,则该命 令可能会阻塞 Redis 服务。所以生产环境中一般不使用该命令,而使用 hscan 命令代替。
3.4.6 hsetnx
格式:HSETNX key field value 功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。 说明:若域 field 已经存在,该操作无效。如果 key 不存在,一个新哈希表被创建并 执行 HSETNX 命令。
3.4.7 hdel
格式:HDEL key field [field ...] 功能:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。 说明:返回被成功移除的域的数量,不包括被忽略的域。
3.4.8 hexits
格式:HEXISTS key field 功能:查看哈希表 key 中给定域 field 是否存在。 说明:如果哈希表含有给定域,返回 1 。如果不含有给定域,或 key 不存在,返回 0
3.4.9 hincrby 与 hincrbyfloat
格式:HINCRBY key field increment
功能:为哈希表 key 中的域 field 的值加上增量 increment 。hincrby 命令只能增加整 数值,而 hincrbyfloat 可以增加小数值。
说明:增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新 的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域 的值被初始化为 0。对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
3.4.10 hkeys 与 hvals
格式:HKEYS key 或 HVALS key
功能:返回哈希表 key 中的所有域/值。
说明:当 key 不存在时,返回一个空表。 3.4.11 hlen
格式:HLEN key 功能:返回哈希表 key 中域的数量。
说明:当 key 不存在时,返回 0 。
3.4.12 hstrlen
格式:HSTRLEN key field
功能:返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。
说明:如果给定的键或者域不存在, 那么命令返回 0 。
3.4.13 应用场景
Hash 型 Value 非常适合存储对象数据。key 为对象名称,value 为描述对象属性的 Map, 对对象属性的修改在 Redis 中就可直接完成。其不像 String 型 Value 存储对象,那个对象是 序列化过的,例如序列化为 JSON 串,对对象属性值的修改需要先反序列化为对象后再修改, 修改后再序列化为 JSON 串后写入到 Redis。