Redis ZSKIPLIST_MAXLEVEL(64)是否足以容纳2^64个元素?;

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

我最近从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*/


我错了还是配置错了?

你是对的。公平地说,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字节