为什么zset底层是跳表而不是红黑树或者b+树

2 分钟阅读 336 字 + 95 词
zset是redis的有序集合,是需要 支持范围查找 的,而红黑树是弱平衡二叉查找树,范围查找开销比较大,需要不断的遍历节点。而对于跳表的话,只需要从上层链表的索引就能确定最底层的范围了,然后从最底层取数据就行了。
那为什么不用b+树呢。b+树的叶子节点是存储了数据的,而非叶子节点只存储索引,并且b+树是多路平衡查找二叉树。并且叶子结点每一个节点都是挨个链接起来的是一个双向链表。所以说b+树也是可以做范围查找的。
但是b+树去查找一个节点的时间复杂度是要比跳表高的。 是h*log2n 。在每一个非叶子节点中,需要利用二分查找来找到对应的索引,然后再往子节点去搜索,所以说还要乘上一个树的高度。
所以说 跳表是适合用来组织内存数据的 。而 B+树适合组织磁盘数据
因为 B+树的磁盘IO次数是根据树的高度来算的 。每次访问一个节点就是一次磁盘IO,它是一个扁平的结构,意味着更少的磁盘IO。跳表中的比较次数就比较多了。

目录