gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:13:13 25 4
gpt4 key购买 nike

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

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

但是为什么在值很大的时候会转成hashtable呢?据我所知,由于 ziplist 的条目中有一个“长度”字段,因此一个条目是 1 位还是 100 位并不重要,它只需要移动整个条目即可获得下一个条目。

最佳答案

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

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

另一方面,由于 ziplist 以紧凑的方式将所有条目保存在连续的内存中,几乎每个写入操作都必须重新分配内存。这非常CPU 效率低下。还编码和解码那些 可变长度编码 数字成本 CPU。

所以如果入口数据/值很小,可以使用ziplist来达到内存效率。但是,如果数据很大,您将无法获得太多 yield ,同时会花费大量 CPU 时间。

关于redis - 当键或值很大时,为什么redis哈希从ziplist转换为哈希表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47882718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com