Redis 跳表:
skipList的原理:
先谈谈有序双向链表:
redis很快,为什么快?因为内存操作+单线程(redis6.0之前)吗,不全是
1.从有序链表到跳表
有序双向链表查询的时间复杂度为O(n),效率并不高,有什么办法可以提高查询效率呢?,试试二分法
在做增删改操作时,每隔一个节点,维护一个二层指针,用来提高查询效率,
eg.查询值为9时,
单层有序链表查询过程为:1->3->5->7->9
二层有序链表查询过程为:1->5->9
效率有所提升
既然尝到了甜头,我们再增加链表层高试一下,当链表高度增加为三层时:
在这里插入图片描述
单层有序链表查询过程为:1->3->5->7->9
二层有序链表查询过程为:1->5->9
三层有序链表查询过程为:1->9
查询效率是不是会高很多(/doge),但是这样做数据存储是有问题的
当多层链表在做增删改的时候,要去维护它的数据结构是一件非常耗费性能事情,在极端情况下,节点增删改的效率会达到O(n)
针对这个问题,我们可以选择在节点赋值层高时,通过随机分配层高去解决,这样,在进行节点增删操作时,只需要进行对目标节点进行操作,不会影响到其他节点
2.Redis跳表实现(默认参数)
· Redis的跳表最高层高为32
· Redis跳表的一个节点有i层,那么他的下一个节点有i+1层的概率为1/4
这样会保证高层节点出现的概率较低,且层高越高,概率越低,可以很好地保证查询效率
· Redis跳表的节点实现还有ziplist和dict
3.Redis skipList与平衡二叉树的比较
· skipList在进行增删改时只需要对目标节点进行操作即可,而平衡二叉树可能需要维持二叉树的平衡,做节点交换操作。
· skipList进行范围查询时,查到开始节点,再向后遍历即可,而平衡二叉树在找到开始节点后,需要通过中序遍历查找结束节点。
· skipList在算法实现上比平衡二叉树相对简单
写在最后
参考文档:https://zhuanlan.zhihu.com/p/23370124