Redis ZSKIPLIST_MAXLEVEL(64)是否足以容纳2^64个元素?;
我最近从skiplist中学到了skiplist:一种平衡树的概率替代方法。我认为p=0.25的64个级别应该有4^64个元素(如果p=1/2,则使用MaxLevel=16适用于最多包含2^16个元素的数据结构。--引用平衡树的概率替代方案)。但是当我检查Redis server.h时,我发现 定义ZSKIPLIST_MAXLEVEL 64/*应足以容纳2^64个元素*/ 定义ZSKIPLIST_p 0.25/*Skiplist p=1/4*/Redis ZSKIPLIST_MAXLEVEL(64)是否足以容纳2^64个元素?;,redis,skip-lists,Redis,Skip Lists,我最近从skiplist中学到了skiplist:一种平衡树的概率替代方法。我认为p=0.25的64个级别应该有4^64个元素(如果p=1/2,则使用MaxLevel=16适用于最多包含2^16个元素的数据结构。--引用平衡树的概率替代方案)。但是当我检查Redis server.h时,我发现 定义ZSKIPLIST_MAXLEVEL 64/*应足以容纳2^64个元素*/ 定义ZSKIPLIST_p 0.25/*Skiplist p=1/4*/ 我错了还是配置错了?你是对的。公平地说,serve
我错了还是配置错了?你是对的。公平地说,server.h定义的MAXLEVEL高于必要的级别 特定元素达到至少
k
水平的概率为p^k
,任何n
元素达到至少k
水平的概率为n·p^k
Redis将跳过列表用于排序集,并将其与哈希映射结合使用。哈希映射(dict
)的容量为2^64-1
个元素(准备就绪,从未在实践中测试过)。因此对ZSKIPLIST\u MAXLEVEL
的评论
因此,如果我们使用N=2^64
作为跳过列表中元素数量的上限,Redis可能会使用ZSKIPLIST_MAXLEVEL=32
节点按照掷骰子时实际获得的级别分配内存。只有第一个空节点使用ZSKIPLIST_MAXLEVEL。影响:每个已排序列表(129个或更多条目-之前,它使用ziplist,请参见zset max ziplist entries
config设置)有512字节的额外内存
另一个副作用是节点有可能获得不必要的高水平,但当我们上升到32次方水平以上时,几率会很快降低
我认为这是值得修复的IMO,对于那些512字节