想必使用 MySQL 的读者都知道 B+树这个数据结构,B+ 树是一种常用的数据结构,具有以下特点:

  1. 多叉树结构:它是一颗多叉树,每个节点包含多个子节点,减小了树的高度,查询效率高。
  2. 存储效率高:其中非叶子节点存储多个 key,叶子节点存储 value,使得每个节点节点能够存储更多的键,根据索引进行范围查询时查询效率更高。
  3. 平衡性:它是决对的平衡,即树的各个分支高度相差不大,确保查询和插入时间复杂度为 O(logn)
  4. 顺序访问:叶子节点间通过链表指针相连,范围查询表现出色。
  5. 数据均匀分布:B+树插入时可能会导致数据重新分布,使得数据在整棵树分布更加均匀,保证范围查询和删除效率。

Untitled

所以,B+树更适合作为数据库和文件系统中常用的索引结构之一,它的核心思想是通过可能少的 IO 定位到尽可能多的索引来获得查询数据。对于 Redis 这种内存数据库来说,它对这些并不感冒,因为 Redis 作为内存数据库它不可能存储大量的数据,所以对于索引不需要通过 B+树这种方式进行维护,只需按照概率进行随机维护即可,节约内存。而且使用跳表实现 zset 时相较前者来说更简单一些,在进行插入时只需通过索引将数据插入到链表中合适的位置再随机维护一定高度的索引即可,也不需要像 B+树那样插入时发现失衡时还需要对节点分裂与合并。


著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/database/redis/redis-skiplist.html