有序集合类型 的对象编码方式为 OBJ_ENCODING_ZIPLIST 和 OBJ_ENCODING_HT,对应的 底层数据结构为 压缩列表ziplist 和 字典dict
其实 哈希类型 和 有序集合类型 一定程度上很像,特别是在 ziplist 的类型限制条件上
哈希类型 在使用 ziplist 作为底层数据结构的时候,每个 集合元素 使用紧挨着的两个压缩列表节点表示,第一个节点 保存元素 成员,第二个节点 保存元素 分值;压缩列表中集合元素都是按照 添加时间上 进行排序存储的,后添加的 键值对 从 压缩列表 尾部 压入
而 哈希类型 中的 字典结构 就比较简单了,哈希类型 每个键值对 都对应 字典中的每个键值对,就像我们在 字典篇章 中提到的,比如 HMSET person name "kety" age 20 weight "75kg" height 20
,即为 操作 key 为 person 的字典,而 值也是由字典结构数据组成,key=name | key=age | key=weight | key=height
编码转换
跟 上一篇 的 有序集合类型 一样道理,哈希类型 涉及到了 两个数据结构 压缩列表 ziplist 和 字典 dict ,所以也会涉及 两个结构的编码转换
当 哈希条件 可以同时满足以下条件的时候,对象使用 ziplist 结构,否则就使用 dict 结构 作为底层实现
- 哈希类型 保存的所有键值对个数小于 128个(这个限制是由
hash-max-ziplist-entries
参数控制,对应 server 全局变量为server.hash_max_ziplist_entries
,默认 128) - 哈希类型 保存的所有键值对的长度都小于 64 字节(这个限制是由
hash-max-ziplist-value
参数控制,对应 server 全局变量为server.hash_max_ziplist_value
,默认 64)
对于使用 ziplist 编码的 哈希对象来说,当使用 ziplist 编码所需的两条件任意一个不被满足,就会执行对象的 编码转换操作,原本保存在 压缩列表 ziplist 中的元素都会被转移到 dict 结构中,编码也会跟着变成 dict
下面我们就 Redis 有序集合类型 一些典型的 API 进行解析~~~
源码解析
由于有些方法里的代码量比较大,我们这里按照 典型的代码片段进行解析,同志们可以根据文章提示的代码位置 和 代码里面的关键词 在源码中搜素,可能数据结构一些元素 看不太懂什么意思,没关系,先混个脸熟,后面看完回头再看过来就明白了
首先我们上面提到的编码类型转换函数为 hashTypeConvertZiplist()
比较典型的 hset 添加命令 的 入口函数为 hsetCommand()
,具体处理逻辑为 hashTypeSet()
|
|
以上为比较经典的函数逻辑解析,另外我从 其他资料找到了 一些 API 的详解,大家可以将就看看
本文作者: wettper
本文链接: http://www.web-lovers.com/redis-source-hash.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!