当前位置: 首页 > 面试题库 >

Redis数据结构空间要求

常俊侠
2023-03-14
问题内容

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获取内存占用量。



 类似资料:
  • 问题内容: 可以说我有一个散列,例如 存储这种数据结构的“通常”方式是什么(或者您不会吗?) 您是否可以直接获得价值(例如,获取哈利:年龄? 一旦存储,您是否可以直接更改子键的值(例如,sally:weight = 100) 问题答案: 存储这种数据结构的“通常”方式是什么(或者您不会吗?) 例如,哈利(Harry)和莎莉(Sally)将分别存储在单独的散列中,其中字段代表其属性,例如年龄和体重。

  • 世间任何文档,都是相似的 如何描述一个文档 抽象的看,任何一个文档都可以下列结构来描述 文档级属性 { # ZDocMetas 标题 作者 子标题 创建日期 指定样式表 … } 标题 # ZDocNode.depth=0 … 一块内容 … # ZDocN

  • 问题内容: 我试图在一个明确的列表中回答两个问题: Redis的底层数据结构是什么? 每种类型的主要优点/缺点/用例是什么? 因此,我读过Redis列表实际上是用链接列表实现的。但是对于其他类型,我无法提取任何信息。同样,如果有人偶然发现了这个问题,而又对修改或访问不同数据结构的优缺点没有一个高层次的总结,那么他们将有完整的清单,列出 何时可以最佳地使用特定类型 进行引用。 具体来说,我希望概述所

  • 在Redis中创建键时,我使用“:”格式,并将其与URL结构类似地处理。 但如果该结构本身包含键-值类型组合呢?有人把钥匙放在结构里吗? 虚构示例: 在某些方面,我认为选项A的结构中有力量,但也给关键增加了很多复杂性。 想法?

  • 我有一个积分宽度的项目列表,可以解释为从左到右堆叠在一起的间隔。例如,假设项目是A、B、C、D、E和F,宽度分别为5、2、2、3、2和4: 项目下面的数字表示从列表开始的偏移量。 我正在寻找一种能够有效支持这些操作的数据结构,理想的情况是在O(n)以内: 在给定位置从中查找项目。例如,位置11处的项目是D,因为它的跨度从9到12,而位置14处的项目是F,因为它从那里开始 在任意两个现有项目之间插入

  • 顺序结构 顺序栈(Sequence Stack) SqStack.cpp 顺序栈数据结构和图片 typedef struct { ElemType *elem; int top; int size; int increment; } SqStack; 队列(Sequence Queue) 队列数据结构 typedef struct { ElemType * elem; int fron