Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis深度解析:跳跃表的原理与应用

Redis深度解析:跳跃表的原理与应用

原创
作者头像
windealli
发布于 2024-05-22 06:26:32
发布于 2024-05-22 06:26:32
5.8K08
代码可运行
举报
文章被收录于专栏:windealliwindealli
运行总次数:8
代码可运行

一、跳跃表简介

跳跃表SkipList是一种有序的数据结构,是Redis有序集合的底层实现之一。

跳跃表中,数据被存储在节点中,每个节点包含一个数据元素和一组指向其他节点的指针。这些指针分布在不同的层级,用于提升跳跃表的访问性能。

跳跃表支持平均O(log N)、最坏O(N)复杂度的查找性能,并且支持通过顺序性操作来批量处理节点。

在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为眺跃表的实现比平衡树 要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。

二、跳跃表的原理

1. 跳跃表的数据结构

跳跃表是一种扩展的有序链表,它通过维护一个多级索引结构来实现快速查找。在跳跃表中,每个节点包含一个数据元素和一组指向其他节点的指针。这些指针分布在不同的层级,每个层级的指针数量都比下一层级少。最底层(第0层)包含所有的元素,而最高层则只包含少数几个元素。这样,查找操作可以在高层级开始,快速跳过那些不需要的元素。

  • 简单的有序链表

在简单的有序列表中,要访问节点节点3需要经过节点1、2、3共3个节点;要访问节点9需要经过节点1、2、3…8、9共9个节点

  • 跳跃表

在跳跃表中,要访问节点节点3需要经过节点1、3共2个节点(通过L1索引);要访问节点9需要经过节点1、7、9共3个节点(通过L3索引)。

可以看到查找的复杂度得到极大提升。

2. 跳跃表的查找、插入和删除操作

  • 查找操作 从最高层索引的头节点开始,
    • 如果当前节点的下一个节点的值小于要查找的值,则向右移动;
    • 如果当前节点的下一个节点的值大于要查找的值,则向下移动,
    • 直到找到目标值或者确定目标值不存在。
  • 插入操作 首先进行查找操作,找到插入位置。然后随机生成一个层数,根据这个层数在每一层插入新节点。
  • 删除操作: 首先进行查找操作,找到要删除的节点。然后在每一层删除这个节点。

3. 跳跃表的时间复杂度分析

由于跳跃表的层级结构,查找、插入和删除操作的平均时间复杂度和最坏时间复杂度都是O(log n),其中n是跳跃表中元素的数量。这使得跳跃表在处理大量数据时具有很高的效率。同时,跳跃表的空间复杂度是O(n),因为每个元素都需要存储在跳跃表中。

三、Redis中的跳跃表

1. Redis中跳跃表的实现

Redis中的跳跃表实现与基本的跳跃表有一些不同。在Redis中,跳跃表的每个节点除了包含一个指向下一个节点的指针数组外,还包含一个反向指针,指向前一个节点。这样,Redis的跳跃表可以支持双向遍历。此外,Redis的跳跃表还包含一个header节点和一个tail节点,分别指向跳跃表中的第一个节点和最后一个节点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* ZSETs use a specialized version of Skiplists */
typedef struct zskiplistNode {
    sds ele;
    double score;
    struct zskiplistNode *backward;
    struct zskiplistLevel {
        struct zskiplistNode *forward;
        unsigned long span;
    } level[];
} zskiplistNode;

2. Redis中跳跃表的特性

Redis中的跳跃表具有以下特性:

  • 支持快速查找:由于跳跃表的多级索引结构,Redis可以在O(log N)的时间复杂度内查找到任意节点。
  • 支持范围查找:由于跳跃表的有序性,Redis可以在O(log N)的时间复杂度内找到满足特定范围条件的所有节点。
  • 支持双向遍历:由于每个节点都包含一个反向指针,Redis的跳跃表可以支持从任意节点开始的双向遍历。

四、跳跃表与其他数据结构的比较

1. 跳跃表与平衡树

平衡树(如AVL树、红黑树等)和跳跃表都是可以进行快速查找的数据结构,它们的查找、插入和删除操作的时间复杂度都是O(log N)。然而,平衡树的实现通常比跳跃表复杂,需要处理更多的旋转和平衡操作。相比之下,跳跃表的实现更简单,更易于理解和操作。

2. 跳跃表与哈希表

哈希表的查找、插入和删除操作的平均时间复杂度是O(1),优于跳跃表的O(log N)。然而,哈希表不支持有序操作,例如获取最小值、最大值或者进行范围查找。而跳跃表由于其有序性,可以很好地支持这些操作。

3. 跳跃表与链表

链表是一种基础的数据结构,其查找、插入和删除操作的时间复杂度是O(N)。而跳跃表是对链表的扩展,通过添加多级索引,将查找、插入和删除操作的时间复杂度降低到O(log N)。同时,跳跃表保留了链表的有序性,可以支持一些链表无法支持的有序操作。

五、Redis中跳跃表的应用场景

在Redis中,跳跃表主要被用于实现有序集合Sorted Set

有序集合是Redis支持的一种数据类型,它不仅可以存储一组元素,还可以为每个元素关联一个分数。通过这个分数,Redis可以快速地获取分数最高或最低的元素,或者获取满足特定分数范围的所有元素。这些操作都是通过跳跃表来实现的。

跳跃表在Redis集群节点中用作内部数据结构。

跳跃表在Redis中仅用于有序集合和集群节点内部数据结构两种场景。

六、跳跃表的优缺点小结

优点:

  • 跳跃表的查找、插入和删除操作的时间复杂度都是O(log N),在处理大量数据时具有很高的效率。
  • 跳跃表的实现相对简单,比如相比于平衡树,跳跃表不需要进行复杂的旋转和平衡操作。
  • 跳跃表支持有序操作,如获取最小值、最大值或进行范围查找。

缺点:

  • 跳跃表的空间复杂度是O(N),每个元素都需要存储在跳跃表中,这可能会占用较多的内存。
  • 跳跃表的性能依赖于随机数生成器,如果随机数生成器的质量不高,可能会影响跳跃表的性能。

我的公众号:海天二路搬砖工

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis为什么要使用跳跃表?
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
chengcheng222e
2021/11/04
1.4K0
《Redis设计与实现》读书笔记(四) ——Redis中的跳跃表
《Redis设计与实现》读书笔记(四) ——Redis中的跳跃表 (原创内容,转载请注明来源,谢谢) 一、概述 跳跃表(skiplist)是一种有序的数据结构,它通过每个节点中维持多个指向其他节点的指针,从而实现快速访问。跳跃表平均O(logN),最坏O(N),支持顺序遍历查找。 在redis中,有序集合(sortedset)的其中一种实现方式就是跳跃表。当有序集合的元素较多,或者集合中的元素是比较常的字符串,则会使用跳跃表来实现。另外,在redis集群节点中的内部数据结构,也是用跳跃表实现。 二、跳跃表实
用户1327360
2018/03/07
1.1K0
《Redis设计与实现》读书笔记(四)  ——Redis中的跳跃表
Redis使用及源码剖析-5.Redis跳跃表-2021-1-19
跳跃表是Redis的底层数据结构之一,跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均 O(\log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。在大部分情况下, 跳跃表的效率可以和平衡树相媲美, 并且因为跳跃表的实现比平衡树要来得更为简单, 所以有不少程序都使用跳跃表来代替平衡树。 Redis跳表实现涉及redis.h 中的 zskiplist 结构和 zskiplistNode 结构, 以及 t_zset.c 中所有以 zsl 开头的函数, 比如 zslCreate 、 zslInsert 、 zslDeleteNode ,本文将详细分析Redis跳表的实现。
用户7719114
2022/02/22
4750
Redis使用及源码剖析-5.Redis跳跃表-2021-1-19
Redis 为什么用跳表,而不用平衡树?
之前写过一篇 Redis 数据类型的底层数据结构的实现:为了拿捏 Redis 数据结构,我画了 40 张图
小林coding
2022/10/27
6490
Redis 为什么用跳表,而不用平衡树?
Redis跳跃表的一些操作和特性
通过以上步骤,可以保证在删除Redis节点时,跳跃表的正确性得到保证。同时,为了保持性能的平衡,可以考虑以下方面:
一凡sir
2023/09/17
2870
Redis跳跃表的一些操作和特性
5分钟了解Redis的内部实现跳跃表(skiplist)
跳跃表(skiplist)是一个有序的数据结构,它通过在每个节点维护不同层次指向后续节点的指针,以达到快速访问指定节点的目的。跳跃表在查找指定节点时,平均时间复杂度为,最坏时间复杂度为O(N)。
万猫学社
2022/06/14
4650
5分钟了解Redis的内部实现跳跃表(skiplist)
Redis03-Redis的数据结构之跳表
上一篇文章我们介绍了字典这个数据结构,这一篇文章我们接着来学习下另外一个数据结构,跳表。那么什么是跳表呢?
码农飞哥
2021/08/18
4900
跳跃表深入理解
redis 中 zset 是一个有序非线性的数据结构,它底层核心的数据结构是跳表。跳表(skiplist)是一个特俗的链表,相比一般的链表,有更高的查找效率,其效率可比拟于二叉查找树。
CodingCode
2021/06/10
4950
跳跃表深入理解
你确定不来了解一下Redis跳跃表的原理吗
目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗?很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。用跳表吧,跳表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表,就能轻松实现一个 SkipList。
王知无-import_bigdata
2019/07/09
1.7K0
你确定不来了解一下Redis跳跃表的原理吗
跳跃表确定不了解下😏
hello,大家好,周五见了。前面几周我们一起看了Redis底层数据结构,如动态字符串SDS,双向链表Adlist,字典Dict,如果有对Redis常见的类型或底层数据结构不明白的请看上面传送门。
陈琛
2020/07/07
6680
跳跃表确定不了解下😏
Redis源码之跳表数据结构
跳跃表(skiplist)是一种随机化的数据, 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出, 跳跃表以有序的方式在层次化的链表中保存元素, 效率和平衡树媲美 —— 查找、删除、添加等操作都可以在对数期望时间下完成, 并且比起平衡树来说, 跳跃表的实现要简单直观得多。
杨永贞
2022/05/07
6720
Redis源码之跳表数据结构
《闲扯Redis十》Redis 跳跃表的结构实现
备注: 按照分析顺序,本节应该说道有序集合对象了,但是考虑到有序集合对象的底层实现中使用到了跳跃表结构,避免在分析有序集合时造成突兀,所以本节先来看看 redis 中跳跃表结构的具体实现。
大道七哥
2020/08/12
8870
《闲扯Redis十》Redis 跳跃表的结构实现
Redis数据结构详解(3)-redis中的“排序好手”(跳表skiplist)
自从通过博客开始记录学习内容、整理知识,整个人变得比以前更积极了,虽说本质是为了记录和整理,但不免对各大博客网站的阅读数和点赞评论数关心(虽然到现在还少得可怜哈哈哈),有的博客网站还有自己专属的积分值,甚至还有排行榜,我偶尔也会点开看看,幻想自己能出现在上面~(嘻嘻~梦里什么都有)
苏易困
2022/04/01
7730
Redis数据结构-跳跃表
跳表(skiplist)是一个特殊的链表,相比一般的链表,有更高的查找效率,其效率可比拟于二叉查找树。
程序员酷森
2020/10/19
8500
Redis数据结构-跳跃表
【Redis 系列】redis 学习十四,sorted_set 初步探究梳理
有序集合是集合的一部分,有序集合给每个元素多设置了一个分数,相当于多了一个维度,redis 也是利用这个维度进行排序的
阿兵云原生
2023/02/16
2780
redis zset 的实现,基于链表的二分查找 -- 跳跃表源码解析
二分查找是一个非常简单而实用的算法,其算法基本思想是在一个有序数组中查找某个元素时,通过对比数组中间位置元素与目标元素来淘汰数组中一半的元素,达到高效查找元素的算法目标。
用户3147702
2022/06/27
6700
redis zset 的实现,基于链表的二分查找 -- 跳跃表源码解析
Redis系列(七)底层数据结构之跳跃表
Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?
呼延十
2020/02/17
4680
深入理解什么是跳跃表
前面的文章我们学习了性能高效的基于二叉搜索树的动态数据结构红黑树,其平均时间复杂度为O(logN),今天我们再来学习另外一种优秀的数据结构跳跃表,其综合性能与红黑树一样,而且功能更强大,从某种意义上来说是可以替代红黑树的。
我是攻城师
2019/05/07
2.7K0
深入理解什么是跳跃表
跳跃表(skiplist )详解及其C++编程实现
目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。跳表是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。
全栈程序员站长
2022/11/19
1.5K0
跳跃表(skiplist )详解及其C++编程实现
漫画:什么是跳跃表?
如果是没有商品名称的全量查询怎么办?总不可能把数据库里的所有记录全查出来吧,而且还要支持不同字段的排序。
小灰
2022/07/05
3130
漫画:什么是跳跃表?
相关推荐
Redis为什么要使用跳跃表?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档