当密钥或值很大时,为什么redis哈希从ziplist转换为哈希表?

时间:2017-12-19 08:24:43

标签: redis

有关redis数据结构的两个配置:hash-max-ziplist-entrieshash-max-ziplist-value

很容易理解,当条目太多时它应转换为哈希表,因为它会花费太多时间来获取命令。

但是为什么当值很大时它会转换为哈希表?据我所知,因为有一个"长度"在ziplist的条目中,如果一个条目是1位或100位,则无关紧要,只需移动整个条目即可获得下一个条目。

1 个答案:

答案 0 :(得分:1)

为了向前和向后遍历,doubly linked list必须为每个条目保存两个指针(即64位机器上的16个字节)。如果条目数据很小,比如8个字节,那么它将非常内存效率低:数据只有8个字节,而额外的指针则需要16个字节。

为了解决这个问题, ziplist使用两个variable length encoded数字来替换两个指针,并将所有条目保存在连续内存中。在这种情况下,如果所有条目值都小于64个字节,则这两个variable length encoded个数字只需要2个字节(请纠正我,如果我错了)。这非常内存效率。但是,如果条目数据非常大,比如1024字节,这个技巧不会节省太多内存,因为条目数据的成本更高。

另一方面,由于ziplist以紧凑的方式将所有条目保存在连续内存中,几乎每次写入操作都必须进行内存重新分配。这非常 CPU效率低。同时编码和解码那些variable length encoded数字会花费CPU。

因此,如果条目数据/值很小,您可以使用ziplist来实现内存效率。但是,如果数据量很大,则不会获得太多的增益,而会花费大量的CPU时间。