为什么Redis底层用跳表而不是红黑树或者B+树?
zset为什么不用红黑树?
插入、删除、查找以及迭代输出有序序列这几个操作红黑树也可以完成,且时间复杂度跟跳表一样。但按照区间来查找数据这个操作红黑树的效率没有跳表高, 跳表可以做到 $\ O(log_2N)$ 的时间复杂度定位区间的起点,再在原始链表中顺序往后遍历,非常高效。
其他原因还有跳表更容易代码实现;跳表更加灵活,它可以通过改变索引构建策略,有效平衡执行效率和内存消耗。
Tips: 跳表不能完全替代红黑树,红黑树比跳表的出现要早一些( Hashmap 和 TreeMap 是1.2就有了的),很多编程语言中的 Map 类型都是通过红黑树来实现,做业务开发时可以直接拿来用,不用费劲自己去实现,但跳表没有现成的实现,所以在开发中如果想使用跳表必须要自己实现。在1.6中,有了跳表实现的Map,即ConcurrentSkipListMap,但仿佛跳表实现的Map不如HashMap稳定。
zset为什么不用B+树?
B+树的原理是叶子节点存储数据,非叶子节点存储索引,B+树的每个节点可以存储多个关键字,它将节点大小设置为磁盘页的大小,充分利用了磁盘预读的功能。每次读取磁盘页时就会读取一整个节点,每个叶子节点还有指向前后节点的指针,为的是最大限度的降低磁盘的IO;因为数据在内存中读取耗费的时间是从磁盘的IO读取的百万分之一。而Redis是内存中读取数据,不涉及IO,因此使用了跳表;
为什么Redis使用单线程读取速度还这么块?
因为Redis不涉及I/O操作,而多线程更适合用于I/O操作多的情况。
Tips:1.CPU在切换线程的时候有上下文切换时间,上下文切换时间非常耗时;但I/O操作更耗时,所以在需要频繁进行I/O操作时,应当优先考虑多线程。2.Redis的性能和CPU无关,其性能瓶颈在:a.机器内存大小,内存大小关系到Redis存储的数据量;b.网络带宽,Redis的客户端和服务端可能部署在不同的机器上,但就近部署降低往返时间RTT,提高性能。
原文链接:https://blog.csdn.net/ellie_chen/article/details/119139963