面试官常问开头,你能说下redis数据结构吗 >>
1、Redis数据结构?
然后向下👇引起zset >>
2、zset底层数据结构:
压缩列表是什么?:
- 底层数据结构:
-
- 本质上就是一个数组,只不过增加了列表长度、尾部偏移量等如下:
-
这样的话就有利于快速寻找列表收尾节点,但是对于其他寻找正常的元素。比如元素1、元素2等等 效率也没有很高效,只能一个个遍历。
3、问题:什么时候使用压缩列表?什么时候使用跳表?
-
- 有序集合元素保存小于128个
- 有序集合保存所有元素的长度小于64字节
4、跳表是什么?
跳表在链表基础上增加多级索引,通过多级索引位置的跳转,实现了快速查找元素。
如:针对一张普通的链表查找元素27该怎么查找呢?
只能从链表的头部往后依次遍历
那么跳表是怎么做的呢?
-
- 建立多级索引
- 可以建立多级索引:在一级索引上在建一个元素创建一个索引;
- 下面举个二级索引的例子:
如图:
下面这张图利用快表快速和找到 -> 70
整个查找过程就是在多级索引之间跳来跳去,最后定位到了这个元素,所以又称为跳表
如图:
注:当数据量特别大的时候,跳表的时间复杂度就是Olog(N),因为它本身运用的思想就有点类似二分法。
5、为什么需要跳表?
-
- 因为普通元素的复杂度是O(N)而跳表的时间复杂度是Olog(N)。
- 查找速度特别快,并且插入、删除也是Olog(N)
插入一个元素:
下面几张题表示 删除一个元素:
6、为什么使用跳表而不使用红黑树或者二叉树呢?他们不也是Olog(N)吗?
-
- 原因一:因为zset有一个很核心的操作叫做范围查找,范围查找效率要比红黑树高。
- 原因二:跳表的实现要比红黑树简单,可以有效的控制跳表的索引层级来控制内存的消耗
注:如果我们要查找某个区间的元素,跳表可以做到Olog(N)快速的查找,比如说你可以找到区间的起点,然后依次往后遍历就可以了。但是,红黑树范围查找的效率没有跳表高