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