Redis数据结构空间要求



redis中排序集和列表之间的空间差异是什么?我的猜测是,排序集是某种平衡的二叉树,列表是一个链表。这意味着,在我为它们编码的三个值(key、score、value)之上,尽管我将把score和value归为链表,但开销是链表需要跟踪另一个节点,而二叉树需要跟踪两个节点,因此使用排序集的空间开销是O(N)。

如果我的值和分数都是long,并且指向其他节点的指针也是long,那么在64位计算机上,单个节点的空间开销似乎从3 long增加到4 long,这意味着空间增加了33%。

这是真的吗?

这远远超出了您的估计。假设没有使用ziplists(即您有大量的项目)。

Redis列表是一个经典的双链表:每个项有3个指针(prev、next、value)。

排序集是一个字典加上一个跳过列表。在字典中,项目也将使用3个指针(键、值、下一个)进行存储。跳跃列表内存占用的计算更为复杂:每个节点需要1个双精度(分数)、2个指针(obj,向后)和n个耦合(指针,跨度值),其中n在1到32之间。大多数项目只需要一两对情侣。

换句话说,当它不表示为ziplist时,排序集是迄今为止开销最大的Redis数据结构。与列表相比,内存开销超过200%(即3倍)。

注意:使用Redis评估内存消耗的最佳方法是尝试用伪数据构建一个大列表或排序集,并使用INFO来获取内存占用。

最新更新