有关redis数据结构的两个配置:hash-max-ziplist-entries
和hash-max-ziplist-value
。
很容易理解,当条目太多时它应转换为哈希表,因为它会花费太多时间来获取命令。
但是为什么当值很大时它会转换为哈希表?据我所知,因为有一个"长度"在ziplist的条目中,如果一个条目是1位或100位,则无关紧要,只需移动整个条目即可获得下一个条目。
答案 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时间。