redis中排序集和列表的空间有什么区别?我的猜测是,排序集是某种平衡二叉树,列表是链表。这意味着除了我为每个值编码的三个值(键、分数、值)之外,尽管我会将链表的分数和值混合在一起,但开销是链表需要跟踪一个另一个节点,二叉树需要跟踪两个,因此使用排序集的空间开销是 O(N)。
如果我的值和分数都是长整型,并且指向其他节点的指针也是长整型,那么在 64 位计算机上,单个节点的空间开销似乎从 3 个长整型变成了 4 个长整型,即 33%空间增加。
这是真的?
这比你的估计要多得多。假设未使用 ziplist(即您有大量项目)。
Redis 列表是一个经典的双链表:每个项目有 3 个指针(上一个、下一个、值)。
排序集是一个字典加上一个跳跃列表。在字典中,项目也将用 3 个指针存储(key、value、next)。跳跃列表内存占用的评估更复杂:每个节点需要 1 个双精度数(分数)、2 个指针(obj、向后),再加上 n 对(指针、跨度值),其中 n 介于 1 到 32 之间。大多数项目仅需要 1 个或 2 对情侣。
换句话说,当它不表示为 ziplist 时,排序集是迄今为止开销最大的 Redis 数据结构。与列表相比,内存开销超过200%(即3倍)。
注意:评估 Redis 内存消耗的最佳方法是尝试使用伪数据构建一个大列表或排序集,并使用 INFO 获取内存占用量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)