- 哈希对象的编码可以是ziplist或者hashtable
- ziplist编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时候,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推入到压缩列表表尾
- 保存了同一键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值的节点在后
- 先添加到哈希对象中的键值对放在压缩列表表头方向,而后来添加到哈希对象中的键值对会放在压缩列表的表尾方向
- hashtable 编码的哈希对象使用字典作为底层实现,哈希对象的每个键值对都使用一个字典键值对来保存
- 字典的每个键盘都是一个字符串对象,对象中保存了键值对的键
- 字典的每个值都是一个字符串对象,对象中保存了键值对的值
- 当哈希对象可以同时满足以下两个条件,哈希对象使用ziplist编码
- 哈希对象保存的的所有键值对的键和值的字符串长度都小于64字节
- 哈希对象保存的键值对数量小于512个,不能满足这两个条件的哈希对象需要使用hashtable 编码
命令 | ziplist编码实现方法 | hashtable编码的实现方法 |
---|---|---|
HSET | 首先调用ziplistPush函数,将键推入到压缩列表的表尾,然后再次调用ziplistPush函数,将值推入到压缩列表的表尾 | 调用dictAdd函数,将新节点添加到字典里面 |
HGET | 首先调用ziplistFind函数,在压缩列表中查找指定所对应的节点,然后调用ziplistNext函数,将指针移动到键节点旁边的值节点,最后返回值节点 | 调用dictFiind函数,在字典中查找给定键,然后调用dictGetVal函数,返回该键所对应的值 |
HEXISTS | 调用ziplistFind函数,在压缩列表中查找指定键所对应的节点,如果找到的话说明键值对存在,没找到的话就说明键值不存在 | 调用dictFind函数,在字典中查找给定键,如果找到的话说明键值对存在,没找到的话就说明键值对不存在 |
HDEL | 调用ziplistFind函数,在压缩列表中查找指定键所对应的节点,然后将相应的键节点,以及键节点旁边的值节点删除 | 调用dictDelete函数,将指定键所对应的键值对从字典中删除 |
HLEN | 调用ziplistLen函数,取得压缩列表包含节点的总数量,将这个数量除以2,得出的结果就是压缩列表保存的键值对数量 | 调用dictSize函数,返回字典包含的键值对数量,这个数量就是哈希对象包含的键值对数量 |
HGETALL | 遍历整个压缩列表,用ziplistGet函数返回所有键和值(都是节点) | 遍历整个字典,用dictGetKey函数返回字典的键,用dictGetVal函数返回字典的值 |