Skip to content

Latest commit

 

History

History
24 lines (22 loc) · 2.91 KB

HashObject.md

File metadata and controls

24 lines (22 loc) · 2.91 KB

REDIS5 哈希对象

哈希对象的构成

  • 哈希对象的编码可以是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函数返回字典的值