【问题标题】:Is ZSKIPLIST_MAXLEVEL(64) enough for 2^64 elements?ZSKIPLIST_MAXLEVEL(64) 是否足以容纳 2^64 个元素?
【发布时间】:2020-02-01 14:13:43
【问题描述】:

我最近从 Skip Lists: A Probabilistic Alternative to Balanced Trees 中了解了 skiplist。我认为 p=0.25 的 64 个级别应该有 4^64 个元素(如果 p = 1/2,使用 MaxLevel = 16 适用于包含多达 2^16 个元素的数据结构。--引自平衡树的概率替代方案) .但是当我检查 Redis server.h 时,我看到了

define ZSKIPLIST_MAXLEVEL 64 /* 应该足以容纳 2^64 个元素 */

define ZSKIPLIST_P 0.25 /* Skiplist P = 1/4 */.

是我错了还是配置错了?

【问题讨论】:

    标签: redis skip-lists


    【解决方案1】:

    你是对的。公平地说,server.h 定义了一个高于必要的 MAXLEVEL。

    特定元素至少达到k 的概率是p^k,任何n 元素达到至少k 的概率是n·p^k

    Redis 将跳过列表用于排序集,并将其与哈希映射结合使用。哈希映射 (dict) 的容量为 2^64-1 元素(已准备好,从未在实践中测试过)。因此评论ZSKIPLIST_MAXLEVEL

    因此,如果我们使用N = 2^64 作为跳过列表中元素数量的上限,Redis 可以使用 ZSKIPLIST_MAXLEVEL = 32。

    节点将内存分配到它们在掷骰子时实际获得的级别。只有第一个空节点使用 ZSKIPLIST_MAXLEVEL。影响:每个排序列表增加 512 字节的额外内存(129 个或更多条目 - 之前,它使用 ziplist,请参阅 zset-max-ziplist-entries 配置设置)。

    另一个副作用是节点获得不必要的高级别的机会,但是当我们超过 32 级别时,几率变得非常低非常快。

    我认为对于这 512 个字节,修复 IMO 是值得的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多