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