Redis学习笔记:跳跃表

news/2024/10/20 16:59:40/

概述

跳跃表(skiplist)是一种有序数据结构。相比于普通的链表访问元素需要一步一步的向后查找,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找。Redis使用跳跃表作为有序集合键的底层实现之一。

实现

下图是跳跃表结构的模型:

查找值51的节点的过程:

  1. 从第2层开始,1比51小,向后比较。
  2. 21比51小,继续向后比较。第2层21节点的next指针指向NULL,所以从21节点开始需要下降一层到第1层继续向后比较。
  3. 第1层中,21节点的next节点为41节点,41比51小,继续向后比较,61比51大,所以从41节点开始降一层到第0层继续向后比较。
  4. 在第0层,51节点为要查询的节点,节点被找到。

使用跳跃表总共查找4次就可以找到51节点,额链表需要6次,当数据量大时,优势会更明显。

Redis跳跃表的实现

基于基础的跳跃表算法,Redis实现的跳跃表略微复杂些,不仅有向前查找的各层指针,还有向后的指针用于倒序遍历,还记录跳跃表的节点数和最高层数,但是原理都是一样的。如图展示了一个跳跃表,该结构包含以下属性:

  • header:指向跳跃表的表头节点。
  • tail:指向跳跃表的表尾节点。
  • level:记录目前跳跃表内,层数最大的那个节点的层数(表头节点的层数不计算在内)。
  • length:记录跳跃表的长度,也即是,跳跃表目前包含节点的数量(表头节点不计算在内)。
  • ele:用于存储字符串类型的数据。
  • score:用于存储排序的分值。
  • backward:后退指针,只能指向当前节点最底层的前一个节点,从后向前遍历跳跃表时使用。
  • level:为柔性数组。每个节点的数组长度不一样,在生成跳跃表节点时,随机生成一个1~64的值,值越大出现的概率越低。

参考

《Redis设计与实现》

《Redis5设计与源码分析》


http://www.ppmy.cn/news/1540572.html

相关文章

OpenCV高级图形用户界面(15)注册一个回调函数来处理鼠标事件的函数setMouseCallback()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 为指定的窗口设置鼠标处理器。 setMouseCallback 是 OpenCV 中的一个功能,允许开发者注册一个回调函数来处理鼠标事件。当用户在窗口…

【论文解读系列】EdgeNAT: 高效边缘检测的 Transformer

代码: https://github.com/jhjie/edgenat 论文: https://arxiv.org/abs/2408.10527v1 论文 EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b)…

2.Node.js 缓冲器(Buffer)

二、常用模块 2.1Buffer(缓冲器) 2.1.1概念 Buffer是一个类似于数组的对象,用于表示固定长度的字节序列 Buffer本质是一段内存空间,专门用来处理二进制数据 2.2.2特点 Buffer大小固定无法调整; Buffer性能较好,可以直接操…

公共字段自动填充-MyBatis-Plus

由于使用了MyBatis-Plus提供的方法操作数据库,所有无法直接使用AOP技术来在mapper方法执行前对公共字段赋值。 在 MyBatis-Plus 中,可以通过实现 MyBatis-Plus 提供的 MetaObjectHandler 接口来实现公共字段的自动填充,比如在插入或更新数据…

2024年【汽车驾驶员(技师)】考试题库及汽车驾驶员(技师)试题及解析

随着汽车行业的快速发展,对汽车驾驶员的专业技能要求也越来越高。为了确保每一位驾驶员都能具备扎实的专业技能和安全生产知识,2024年的汽车驾驶员(技师)考试题库进行了全面更新。安全生产模拟考试一点通作为专业的考试辅导平台&a…

②PROFINET转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 PROFINET 转 Modbus TCP (接上一章) 配置使用 与 PROFINET 主站进行组态说明 这里介绍与西门子 PLC 的…

docker 基础镜像里 scratch 和alpine,ubuntu centos详细对比(镜像优化)

1. scratch 特点 极简:scratch 是一个空的镜像,没有任何操作系统或文件系统。 体积:scratch 镜像的大小几乎为零,是最小的镜像。 灵活性:完全由用户自定义,没有任何预装的工具或库。 依赖管理&#xff1…

【Linux系统编程】第三十三弹---深入探索进程间通信:原理、方式、及管道技术详解

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程为什么要通信 2、进程如何通信 3、进程间常见的通信方式 4、管道 4.1、什么是管道 4.2、匿名管道 4.2.1、定义 …