深入剖析Redis系列- Redis数据结构之哈希

1.11.5哈希类型(hash)
Redis的hash 是一个string类型的key和value的映射表,这里的value是一系列的键值对,hash特别适合用于存储对象。
哈希类型的数据操作总的思想是通过key和field操作value,key是数据标识,field是域,value是我们感
兴趣的业务数据。

1.11.5.1hset
语法:hset key field value [field value …]
功能:将键值对field-value设置到哈希列表key中,如果key不存在,则新建哈希列表,然后执行赋值,如果key下的field已经存在,则value值覆盖。
返回值:返回设置成功的键值对个数。
在这里插入图片描述

1.11.5.2hget
语法:hget key field
功能:获取哈希表 key 中给定域 field 的值。
返回值:field域的值,如果key不存在或者field不存在返回nil。
在这里插入图片描述

1.11.5.3hmset
语法:hmset key field value [field value…]
功能:同时将多个 field-value (域-值)设置到哈希表 key 中,此命令会覆盖已经存在的field,hash表key不存在,创建空的hash表,再执行hmset.
返回值:设置成功返回ok,如果失败返回一个错误。
在这里插入图片描述

1.11.5.4hmget
语法:hmget key field [field…]
功能:获取哈希表 key 中一个或多个给定域的值
返回值:返回和field顺序对应的值,如果field不存在,返回nil。
在这里插入图片描述

1.11.5.5hgetall
语法:hgetall key
功能:获取哈希表 key 中所有的域和值
返回值:以列表形式返回hash中域和域的值,key不存在,返回空hash.
在这里插入图片描述

1.11.5.6hdel
语法:hdel key field [field…]
功能:删除哈希表 key 中的一个或多个指定域field,不存在field直接忽略。
返回值:成功删除的field的数量。
在这里插入图片描述

1.11.5.7hlen
语法:hlen key
功能:获取哈希表 key 中域field的个数
返回值:数值,field的个数。key不存在返回0.
在这里插入图片描述

1.11.5.8hexists
语法:hexists key field
功能:查看哈希表 key 中,给定域 field 是否存在
返回值:如果field存在,返回1,其他返回0。
在这里插入图片描述

1.11.5.9hkeys
语法:hkeys key
功能:查看哈希表 key 中的所有field域列表
返回值:包含所有field的列表,key不存在返回空列表
在这里插入图片描述

1.11.5.10hvals
语法:hvals key
功能:返回哈希表 中所有域的值列表
返回值:包含哈希表所有域值的列表,key不存在返回空列表。
在这里插入图片描述

1.11.5.11hincrby
语法:hincrby key field int
功能:给哈希表key中的field域增加int
返回值:返回增加之后的field域的值
在这里插入图片描述

1.11.5.12hincrbyfloat
语法:hincrbyfloat key field float
功能:给哈希表key中的field域增加float
返回值:返回增加之后的field域的值
在这里插入图片描述

1.11.5.13hsetnx
语法:hsetnx key field value
功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在的时候才设置,否则不设置。
返回值:设值成功返回1,其他返回0.
在这里插入图片描述
内部编码
哈希类型 的 内部编码 有两种:

2.1. ziplist(压缩列表)
当 哈希类型 元素个数 小于 hash-max-ziplist-entries 配置(默认 512 个)、同时 所有值 都 小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为 哈希 的 内部实现,ziplist 使用更加 紧凑的结构 实现多个元素的 连续存储,所以在 节省内存 方面比 hashtable 更加优秀。

2.2. hashtable(哈希表)
当 哈希类型 无法满足 ziplist 的条件时,Redis 会使用 hashtable 作为 哈希 的 内部实现,因为此时 ziplist 的 读写效率 会下降,而 hashtable 的读写 时间复杂度 为 O(1)。

下面的示例演示了 哈希类型 的 内部编码,以及相应的变化。

当 field 个数 比较少,且没有大的 value 时,内部编码 为 ziplist:

127.0.0.1:6379> hmset hashkey f1 v1 f2 v2
OK
127.0.0.1:6379> object encoding hashkey
“ziplist”
当有 value大于64 字节时,内部编码 会由 ziplist 变为 hashtable:
127.0.0.1:6379> hset hashkey f3 “one string is bigger than 64 byte…忽略…”
OK
127.0.0.1:6379> object encoding hashkey
“hashtable”
当 field 个数 超过512,内部编码 也会由 ziplist 变为 hashtable:
127.0.0.1:6379> hmset hashkey f1 v1 f2 v2 f3 v3 … f513 v513
OK
127.0.0.1:6379> object encoding hashkey
“hashtable”