Redis使用篇 - 哈希对象

Hash对象

一个hash对象最多存储2^32 - 1 field-value pairs (more than 4 billion).

hash对象的key和value都是字符串类型。

·

编码

ziplisthashtable

ziplist

ziplist编码的哈希对象使用压缩列表作为底层实现。每当有新的键值对加入到压缩列表时,程序会先将保存了键的压缩列表节点推入到压缩列表的表尾,然后再将保存了值的压缩列表节点推入到表尾。因此,保存了同一键值对的两个节点总是挨在一起。保存键的节点在前,保存值的节点在后。先添加到压缩列表的键值对放在表头方向,而后来添加的键值对放在表尾方向。

Redis使用篇 - 哈希对象_第1张图片

Redis使用篇 - 哈希对象_第2张图片

hashtable

hashtable编码的哈希对象使用字典作为底层实现。哈希对象的每个键值对使用一个字典键值对来保存。字典的每个键都是一个字符串对象,对象中保存了键值对的键。字典的每个值都是一个字符串对象,对象中保存了键值对的值。

Redis使用篇 - 哈希对象_第3张图片

编码转换

当哈希对象同时满足以下两个条件时,哈希对象使用ziplist编码:
1. 哈希对象保存的所有的键值对的键和值的字符串长度<=64字节。(hash-max-ziplist-value)
2. 哈希对象保存的所有的键值对的数量<=512个。(hash-max-ziplist-entries)
当不能同时满足上述的两个条件时,使用hashtable编码。

`

优缺点

  • 优点:
    按照key来聚合存储,节省内存空间。
    可以批量获取(hkeys、hvals、hgetall),批量写入(hmset)。也可以通过hget,直接获取field和value。
  • 缺点:
    expire只能用在key,无法用在field上。
    某些value可能过大而导致数据分布不均衡。

`

使用场景:

  • 购物车

Redis使用篇 - 哈希对象_第4张图片

  • 存储对象

对象的id、属性、属性值 分别对应 key、field、value。因此可以用来存储对象。

当对象的某个属性不是基本类型或字符串时,使用hash类型就必须手动进行复杂序列化。这种情况使用string + json 会更好。

`

命令:

  • hset

设置key指定的哈希集中指定字段的值。如果key指定的哈希集不存在,会创建一个新的哈希集并与key关联。如果字段在哈希集中存在,它会被重写。

hset key field value

根据命令的返回值,如果是1,表示field是个新字端;如果是0,表示field在原来的map里面已经存在。

  • hmset

设置 key 指定的哈希集中指定字段的值。该命令将重写所有在哈希集中存在的字段。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。

hmset key field value [field value …]

  • hsetnx

只在 key 指定的哈希集中不存在指定的字段时,设置字段的值。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。如果字段已存在,该操作无效果。

hsetnx key field value

命令的返回值,如果是1,表示是个新字段,并成功赋值。如果是0,表示哈希集中已存在该字端,没有操作被执行。

  • hdel

从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。
如果 key 指定的哈希集不存在,它将被认为是一个空的哈希集,该命令将返回0。

hdel key field [field…]

  • hexists

返回hash里面field是否存在

hexists key field

根据命令的返回值,如果是1,该field存在;如果是0,表示不包含该field或者key不存在。

  • hincrby

增加 key 指定的哈希集中指定字段的数值。如果 key 不存在,会创建一个新的哈希集并与 key 关联。如果字段不存在,则字段的值在该操作执行前被设置为 0。
HINCRBY 支持的值的范围限定在 64位 有符号整数。

hincrby key field increment

  • hincrbyfloat

为指定key的hash的field字段值执行float类型的increment加。如果field不存在,则在执行该操作前设置为0.如果出现下列情况之一,则返回错误:
field的值包含的类型错误(不是字符串)。
当前field或者increment不能解析为一个float类型。

hincrbyfloat key field increment

  • hget

返回 key 指定的哈希集中该字段所关联的值。

hget key field

  • hmget

返回 key 指定的哈希集中指定字段的值。
对于哈希集中不存在的每个字段,返回 nil 值。因为不存在的keys被认为是一个空的哈希集,对一个不存在的 key 执行 HMGET 将返回一个只含有 nil 值的列表。

hmget key field [field…]

  • hkeys

返回 key 指定的哈希集中所有字段的名字。

hkeys key

  • hvals

返回 key 指定的哈希集中所有字段的值。

hvals key

  • hgetall

返回 key 指定的哈希集中所有的字段和值。

hgetall key

  • hlen

返回 key 指定的哈希集包含的字段的数量。

hlen key

  • hstrlen

返回hash指定field的value的字符串长度,如果hash或者field不存在,返回0。

hstrlen key field

你可能感兴趣的:(#,Redis)