Redis中排序后的集合和列表之间的空间差异是什么?我的猜测是排序集是某种平衡的二叉树,而列表是链接列表。这意味着,在我为它们分别编码的三个值(键,分数,值)之上,尽管我将为链表的分数和值一起拼凑,但开销是链表需要跟踪一个其他节点,并且二叉树需要跟踪两个,因此使用排序集的空间开销为O(N)。
如果我的值和得分都为long,而指向其他节点的指针也为long,则在64位计算机上,单个节点的空间开销似乎从3个long变为4个long。增加空间。
这是真的?
它远远超出您的估计。假设不使用ziplist(即您有很多项)。
Redis列表是经典的双向链接列表:每个项目3个指针(上一个,下一个,值)。
排序的集合是字典加上跳过列表。在字典中,项目也将与3个指针(键,值,下一个)一起存储。跳过列表的内存占用空间评估起来更加复杂:每个节点占用1个双精度值(分数),2个指针(obj,向后),n个对(指针,跨度值),n在1到32之间。大多数项仅占用1个或2对夫妇。
换句话说,当未将其表示为ziplist时,排序后的集合是迄今为止开销最大的Redis数据结构。与列表相比,内存开销超过200%(即3倍)。
注意:使用Redis评估内存消耗的最佳方法是尝试使用伪数据构建一个大列表或排序集,并使用INFO获取内存占用量。