redis中排序集和列表之间的空间差异是多少?我的猜测是有序集是某种平衡的二叉树,列表是链表。这意味着除了我为每个值编码的三个值之外,密钥,分数,值,虽然我将链接列表的得分和值组合在一起,但开销是链接列表需要跟踪一个其他节点,二叉树需要跟踪两个,因此使用有序集的空间开销是O(N)。
如果我的值和得分都是长的,并且指向其他节点的指针也很长,那么在64位计算机上,单个节点的空间开销似乎从3长到4长,这是空间增加了33%。
这是真的吗?
答案 0 :(得分:5)
远不止你的估计。我们假设没有使用ziplists(即你有大量的项目)。
Redis列表是一个经典的双链表:每个项目有3个指针(prev,next,value)。
有序集是字典加上跳过列表。在字典中,项目也将存储3个指针(键,值,下一个)。跳过列表内存占用更加复杂:每个节点需要1个双(得分),2个指针(obj,向后),加上n对(指针,跨度值),n在1到32之间。大多数项目只需要1或2对夫妇。
换句话说,当它没有表示为ziplist时,排序集到目前为止是具有最大开销的Redis数据结构。与列表相比,内存开销超过200%(即3倍)。
注意:使用Redis评估内存消耗的最佳方法是尝试使用伪数据构建大型列表或排序集,并使用INFO来获取内存占用量。