redis数据结构(五) 哈希对象

哈希对象的编码可以是ziplist或者hashtable。ziplist和hashtable分别在列表和集合两篇文章已经讨论过了,本篇就不再重复。本篇文章中,我们将只关注哈希对象相关问题。

ziplist编码的哈希对象

我们复习下前面说过的压缩列表的结构:

<zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>

如上,zlbytes是4字节大小的表示整个压缩列表长度的值,zltail是4字节大小的表示到从zlbytes的起始位置到尾结点的值,zllen是结点的个数,zlend是255。

ziplist编码的哈希对象在使用压缩列表作为底层实现时,每当有新的键值对要加入到哈希对象,程序会先插入key结点,然后插入value结点。也就是这样:

<zlbytes> <zltail> <zllen> <key> <value> ... <key> <value> <zlend>

因此:

  • 保存了同一键值对的两个结点总是紧挨在一起,保存键的结点在前,保存值的结点在后。
  • 先添加到哈希对象中的键值对会被放在压缩列表的表头方向,而后来添加到哈希对象中的键值对会被放在压缩列表的表尾方向。

哈希编码的哈希对象

同样,根据前面我们知道,hashtable的结点结构如下:

typedef struct dictEntry {
    void *key;
    void *val;
    struct dictEntry *next;
} dictEntry;

因此,如果是哈希编码的哈希对象,key和value都将会以一个dictEntry的形式以数组的方式组织起来。

编码转换

当哈希对象可以同时满足以下两个条件时,哈希对象使用ziplist编码:

  • 哈希对象保存的所有键值对的键和值的字符串长度都小于hash-max-ziplist-value(默认64)字节;
  • 哈希对象保存的键值对数量小于hash-max-ziplist-entries(默认512)个;

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

浙ICP备19002997号