redis跳跃表

最近在阅读redis设计与实现,关于redis数据结构zset的一种底层实现跳跃表一直没有太理解,所以在搜了一下资料,终于搞懂了它的设计思路,记录一下。

参考链接:https://mp.weixin.qq.com/s?src=11&timestamp=1553915878&ver=1515&signature=SuSdA-Ka7Bs7CzSnNHgHFR7DkFFibGdRUui-FkuSRn2OJOkn6uvGznFMheSfoxaSHYlcgfGnBQ9imQdTAg5hiaqp2pq2Cn6LWIjN-ZonEvUwLrWwjMxs1WjTFx1A6Wkb&new=1

跳跃表(英文名:Skip List),于 1990 年 William Pugh 发明,是一个可以在有序元素中实现快速查询的数据结构,其插入,查找,删除操作的平均效率都为 O(logn),当需要实现有序列表时,如果使用数组,查找是很快速的,但是插入、删除需要移动大量的元素,成本太大;如果使用链表,虽然插入、删除很方便,但是查询确实O(n)的,当数据量比较大时,这个效率是不能接受的。跳跃表就是综合了数组和链表的特点,使用空间换时间的方法,提升了查询的效率。

原文地址:https://www.cnblogs.com/lit10050528/p/10626540.html

时间: 2024-10-11 12:32:27

redis跳跃表的相关文章

redis - 跳跃表详细介绍

redis吸引很多人使用的一个重要的原因,就是它对众多数据类型的支持.包括string,hash,set,zset,list等五种数据对象. 其中zset用来保证数据的有序存储,实现中,redis使用跳跃表和压缩列表,作为zset的底层实现.当元素数量比较多,或者元素成员是比较长的字符串时,底层实现采用跳跃表. 跳跃表是什么? 一种有序的数据结构,通过在节点中维持多个指向其它节点的指针,达到快速访问的目的. 跳跃表的好处是什么? 1. 跟平衡树相比,实现简单: 2. 平均复杂度为O(logN),

Redis研究-3.4 为何使用Redis跳跃表

好几天没把笔记整理上来了,一个是这几天在忙着一些投标以及项目论文的事情,哈哈,还有么 就是画图也是比较耗费我时间的,如果有好的画图建议或者工具,麻烦推荐一下,谢谢.废话不多说,直接进入今天的两个主题:二叉搜索树,平衡二叉树. 1.二叉搜索树(BST) 二叉搜索树的定义很简单:是二叉树,且满足两个条件:如果有左孩子,则左孩子的关键字一定不大于父节点的关键字,如果有右孩子,则右孩子的关键字不小于父节点的关键字.同时,左右子树都是二叉搜索树. BST_1 中序遍历得到的结果是:1.2.3.4.5.6.

redis 系列7 数据结构之跳跃表

一.概述 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的.在大部分情况下,跳跃表的效率可以和平衡树(关系型数据库的索引就是平衡树结构)相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序使用跳跃表来代替平衡树. Redis使用跳跃表作为"有序集合键"的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现.

redis源码分析4---结构体---跳跃表

redis源码分析4---结构体---跳跃表 跳跃表是一种有序的数据结构,他通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的: 跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点.性能上和平衡树媲美,因为事先简单,常用来代替平衡树. 在redis中,只在两个地方使用了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构. 1 跳跃表节点 1.1 层 层的数量越多,访问其他节点的速度越快: 1.2 前进指针 遍历举例

学习笔记-Redis设计与实现-跳跃表

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的. 跳跃表支持平均O(logN).最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点. Redis使用跳跃表作为有序结合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合见的底层实现. 5.1 跳跃表的实现 zskiplist结构,包含以下属性: header:

redis的跳跃表

跳跃表是一种插入.查询.删除的平均时间复杂度为O(nlogn)的数据结构,在最差情况下是O(n),当然这几乎很难出现. 和红黑树相比较 最差时间复杂度要差很多,红黑树是O(nlogn),而跳跃表是O(n) 平均时间复杂度是一样的 实现要简单很多 https://en.wikipedia.org/wiki/Skip_list 维基的跳跃表例子 跳跃表的结构如上图 跳跃表的实现还是一个链表,是一个有序的链表,在遍历的时候基于比较,但普通链表只能遍历,跳跃表加入了一个层的概念,层数越高的元素越少,每次

Redis中的跳跃表

Redis中的跳跃表 跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的 跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点 跳跃表在Redis用于实现有序集合键和在集群节点中用作内部数据结构 跳跃表的实现 // 跳跃表节点 typedef struct zskiplistNode { // 层 struct zskiplistLevel { // 前进指针 struct zskiplistNode *f

redis源码(五)跳跃表(zskiplist)

1.跳跃表 redis使用跳跃表在两个地方:实现有序集合键?集群节点中用作内部数据结构? 一种有序的数据结构,在每个节点维护多个指向后续节点的指针,完成快速访问后续节点的功能,即就是链表增加了多级索引 Redis的跳跃表由如下:两个结构定义,其中 zskiplistNode结构用于表示跳跃表节点,而 zskiplist结构则用于保存跳跃表节点的相关信息,比如节点的数量,以及指向表头节点和表尾节点的指针等等 typedef struct zskiplistNode { robj *obj; dou

redis 5.0.7 源码阅读——跳跃表skiplist

redis中并没有专门给跳跃表两个文件.在5.0.7的版本中,结构体的声明与定义.接口的声明在server.h中,接口的定义在t_zset.c中,所有开头为zsl的函数. 一.数据结构 单个节点: typedef struct zskiplistNode { //key,唯一 sds ele; //分值,可重复 double score; //后退指针 struct zskiplistNode *backward; //层 struct zskiplistLevel { //前进指针 struc