返回

Redis源代码剖析 — 跳跃表剖析

后端

  1. Redis中的跳跃表简介

Redis中的跳跃表是一种特殊的有序数据结构,它以概率的方式在元素之间建立不同层次的"索引",从而实现快速查找和更新操作。跳跃表与传统的链表相比,具有更快的查找速度和更低的存储开销。因此,Redis将跳跃表广泛应用于有序集合(sorted set)和有序哈希表(sorted hash table)等数据结构中,以实现高效的排序和查找功能。

2. 跳跃表的原理

跳跃表的核心思想是通过建立多层索引来优化查找过程。其基本结构如下图所示:

                                         .-----.
                             .-----.    / .---. \
                      .----'/ .---. \  / .---. . \
                .---'|  .'   .--. |/  / .'   ` .  \
      .-----''`---| /   .'    `. |\ |.'    .'    | |
   .''           `.| .'         `.|| |.'         `. |
   |               | /             \| |              |
   |               |.'               `.|              |
   |               |                  |              |
   |               '.__________________|              |
   '.--.                                 .--.'       |
     `--`                               '--'         |
       |______________________________________________|
       |    |    |    |    |    |    |    |    |    |
       | A  | C  | F  | H  | J  | L  | N  | P  | R  |

注:每一行代表跳跃表中的一层

在跳跃表中,每个节点都有一个或多个"索引"指向其他节点,这些索引被称为"跨度"(span)。跨度的长度是随机确定的,它决定了节点在跳跃表中的"跳跃"距离。跨度越长,节点在跳跃表中的"跳跃"距离就越大。

当在跳跃表中查找一个元素时,算法从最顶层开始,从左到右依次比较每个节点的值。如果当前节点的值大于或等于目标元素的值,则算法向下移动一层,并从当前节点的跨度指向的节点继续比较。如果当前节点的值小于目标元素的值,则算法向右移动一个节点,并继续比较。

通过这种方式,算法可以快速地跳过不相关的部分,直接定位到目标元素所在的区域。这样,查找操作的时间复杂度就从O(n)降低到了O(log n),大大提高了查找效率。

3. 跳跃表的优势

跳跃表具有以下优势:

  • 查找速度快:跳跃表通过建立多层索引,实现了快速查找,时间复杂度为O(log n)。
  • 存储开销低:跳跃表只存储必要的信息,因此存储开销较低。
  • 更新操作快:跳跃表支持高效的更新操作,时间复杂度为O(log n)。
  • 易于实现:跳跃表的实现相对简单,易于理解和实现。

4. Redis中跳跃表的应用

Redis将跳跃表广泛应用于有序集合和有序哈希表等数据结构中。

  • 有序集合(sorted set) :有序集合是一种有序的数据结构,它将元素存储在一个跳跃表中,并根据元素的分值进行排序。有序集合支持快速查找、插入、删除和范围查询等操作。
  • 有序哈希表(sorted hash table) :有序哈希表是一种有序的哈希表,它将哈希表和跳跃表结合在一起,实现了快速查找和更新操作。有序哈希表支持快速查找、插入、删除和范围查询等操作。

5. 总结

跳跃表是一种高效的有序数据结构,它通过建立多层索引来实现快速查找和更新操作。Redis将跳跃表广泛应用于有序集合和有序哈希表等数据结构中,以实现高效的排序和查找功能。