Redis 中的跳跃表是什么?

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis 中的跳跃表(Skiplist)是一种可以替代平衡树的数据结构,它主要用于实现有序集合(Sorted Set)功能。跳跃表通过在多个层级的链表上增加索引来提高查询效率,其效率可以与平衡树相媲美,但实现起来更简单。

Redis 中的跳跃表(Skiplist)是一种可以替代平衡树的数据结构,它主要用于实现有序集合(Sorted Set)功能。跳跃表通过在多个层级的链表上增加索引来提高查询效率,其效率可以与平衡树相媲美,但实现起来更简单。

跳跃表的基本结构

节点(Node):每个节点包含多个层(Level),层越高表示该节点在跳跃表中“跳”得越远(即跨度越大)。每层都包含一个指向前一个节点的指针(除了最左侧的第一个节点)和一个指向该层下一个节点的指针(除了最右侧的节点)。

层(Level):每个节点可以有不同的层数,层数越多,搜索时跳过的节点就越多,搜索效率就越高。但层数也会增加空间消耗。Redis 中通过随机函数来确定每个节点的层数,以保证层数的平均分布。

跨度(Span):每个节点在同一层中的跨度是指该节点与其前一个节点之间的距离(按节点数计算)。跨度用于计算排名(rank)。

向后指针(Backward Pointer):部分实现中,每个节点还会有一个指向其“前一个”节点的指针,用于快速进行反向遍历。Redis 的跳跃表实现中包含了此指针。

跳跃表的优势

简单:相对于平衡树,跳跃表的实现更简单,更容易理解和实现。

插入和删除:跳跃表的插入和删除操作平均时间复杂度为 O(log n),其中 n 是跳跃表中节点的数量。

范围查询:跳跃表支持快速的范围查询操作,即查询某个范围内的所有元素。

Redis 中的跳跃表

Redis 中的有序集合(Sorted Set)是通过跳跃表实现的。除了跳跃表之外,Redis 还为每个有序集合维护了一个字典(Dictionary),字典的键是成员(Member),值是成员的分数(Score)。这样做是为了能够以 O(1) 的时间复杂度进行基于分数的查找操作。

插入操作:首先,在字典中插入或更新成员及其分数。然后,在跳跃表中按照分数进行排序插入或更新。

删除操作:首先在字典中删除成员,然后在跳跃表中查找并删除对应的节点。

范围查询:首先使用字典或跳跃表确定范围的边界,然后在跳跃表中按照分数顺序遍历范围内的所有节点。

总结

Redis 中的跳跃表是一种高效的数据结构,用于实现有序集合的功能。它通过多层级索引来提高搜索效率,同时保持了相对简单的实现。跳跃表在 Redis 的有序集合操作中扮演着核心角色。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
存储 NoSQL Java
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
面试官问:那有序集合为什么要同时使用字典和跳跃表来实现?我:这个设计主要是考虑了性能因素。1. 如果单纯使用字典,查询的效率很高是O(1),但执行类似ZRANGE、ZRNK时,排序性能低。每次排序需要在内存上对字典进行排序一次,同时消耗了额外的O(n)内存空间
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
|
5月前
|
消息中间件 存储 NoSQL
Redis数据结构—跳跃表 skiplist 实现源码分析
Redis 是一个内存中的数据结构服务器,使用跳跃表(skiplist)来实现有序集合。跳跃表是一种概率型数据结构,支持平均 O(logN) 查找复杂度,它通过多层链表加速查找,同时保持有序性。节点高度随机生成,最大为 32 层,以平衡查找速度和空间效率。跳跃表在 Redis 中用于插入、删除和按范围查询元素,其内部节点包含对象、分值、后退指针和多个前向指针。Redis 源码中的 `t_zset.c` 文件包含了跳跃表的具体实现细节。
|
5月前
|
存储 NoSQL Redis
Redis数据结构—跳跃表 skiplist
Redis数据结构—跳跃表 skiplist
|
7月前
|
存储 NoSQL Redis
你了解Redis中的跳跃表吗?
你了解Redis中的跳跃表吗?
|
存储 NoSQL 算法
Redis从入门到精通之答疑为什么ZSet使用跳跃表而不是平衡树、哈希表
有同学阅读了Redis从入门到精通章节中的《Redis从入门到精通之底层数据结构跳表 SkipList》向我提问Redis从入门到精通之答疑为什么ZSet使用跳跃表而不是平衡树、哈希表。今天就做一个解答
1062 7
Redis从入门到精通之答疑为什么ZSet使用跳跃表而不是平衡树、哈希表
|
存储 NoSQL Redis
今天终于知道 Redis 为什么要用跳跃表了
Redis 为什么会选择用跳表来实现有序集合呢? 为什么不用红黑树呢?学完今天的内容,你就知道答案了。
434 1
|
存储 机器学习/深度学习 NoSQL
|
NoSQL Redis
5分钟了解Redis的内部实现跳跃表(skiplist)
跳跃表(skiplist)是一个有序的数据结构,它通过在每个节点维护不同层次指向后续节点的指针,以达到快速访问指定节点的目的。跳跃表在查找指定节点时,平均时间复杂度为,最坏时间复杂度为O(N)。
269 0
5分钟了解Redis的内部实现跳跃表(skiplist)
|
存储 NoSQL 算法
Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?
Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?
215 0
|
机器学习/深度学习 NoSQL API
Redis的设计与实现(4)-跳跃表
跳跃表 (skiplist) 是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。Redis 使用跳跃表作为有序集合键的底层实现之一。
80 2