关于redis跳表skipList实现的理解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值