redis源码阅读笔记(4)——skiplist

0.跳表基础知识
跳表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。
跳跃表支持平均 O(log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。
在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。

一个跳表的图示如下
[img]http://dl2.iteye.com/upload/attachment/0098/8861/0ebae998-16af-33d5-a256-0392b26bae87.jpg[/img]
可以看到如果要查找117这个元素,可以沿着红线的方向,“跳”着找,最终找到117,所以效率很高。

参考资料
[url=http://www.cnblogs.com/baogg/articles/2664793.html]SkipList 跳表[/url]

在JDK6中也加入了跳表的实现ConcurrentSkipListMap和ConcurrentSkipListSet,
他们的功能相当于JDK6以前的TreeMap和TreeSet(两者都采用红黑树来实现),只不过新的跳表更高级了,支持高并发。

1.高层视角解读

请先看这篇文章
[url=http://www.redisbook.com/en/latest/preview/skiplist/datastruct.html]跳跃表的实现[/url]
redis中的skiplist的数据结构如图所示
[img]http://www.redisbook.com/en/latest/_images/graphviz-8fc5de396a5b52c3d0b1991a1e09558ad055dd86.png[/img]

2.底层代码
API定义请看redis.h/zskiplistNode 和 redis.h/zskiplist
API实现请看t_zset.c,将近4000行代码。

span的作用?
跨度实际上是用来计算排位(rank)的: 在查找某个节点的过程中, 将沿途访问过的所有层的跨度累计起来, 得到的结果就是目标节点在跳跃表中的排位。
可以看zslGetRank函数的代码,正是有了这个span,使得计算一个元素的rank可以非常的高效!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值