Redis 跳跃列表与紧凑列表

Redis 跳跃列表(Skip List)

跳跃列表是一种高效的数据结构,它结合了有序数组和链表的优点,能够在 O(log n) 时间内进行插入、删除和查找操作。Redis 使用跳跃列表来实现有序集合(sorted set)的底层数据结构之一。

1. 跳跃列表的结构

跳跃列表由多个层级的链表组成,每一层都是一个有序链表。最低层包含所有元素,每一层都按一定概率跳过一些元素,从而减少查询路径的长度。

节点结构

每个节点包含以下几个部分:

  • :节点存储的实际数据。
  • 分数:用于排序的关键值。
  • 前向指针数组:指向不同层级的下一个节点。

示意图:

Level 3:      1 ------> 6
Level 2:      1 --> 3 ------> 6 --> 9
Level 1:  1 --> 2 --> 3 --> 4 --> 5 --> 6 --> 7 --> 8 --> 9

2. 跳跃列表的操作

插入操作

插入一个新元素时,首先需要找到插入位置。查找路径通过各层链表找到最接近的节点,然后插入新节点并更新前向指针数组。

示意图:

原始列表:
Level 3:      1 ------> 6
Level 2:      1 --> 3 ------> 6 --> 9
Level 1:  1 --> 2 --> 3 --> 4 --> 5 --> 6 --> 7 --> 8 --> 9

插入 4.5:
Level 3:      1 ------> 6
Level 2:      1 --> 3 ------> 6 --> 9
Level 1:  1 --> 2 --> 3 --> 4 --> 4.5 --> 5 --> 6 --> 7 --> 8 --> 9
删除操作

删除元素时,类似于插入操作,先找到要删除的节点,然后调整前向指针数组,移除该节点。

查找操作

查找操作利用各层链表加速定位目标元素,通过前向指针数组快速跳过无关节点,找到目标节点。

3. 跳跃列表的实现

Redis 中跳跃列表的实现主要包括以下几个结构体:

  • zskiplistNode:跳跃列表节点结构,包含值、分数、前向指针数组等。
  • zskiplist:跳跃列表结构,包含头节点、尾节点、
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值