当前位置: 首页 > news >正文

【Redis】跳表结构

目录

  • 1、背景
  • 2、跳表
    • 【1】底层结构
    • 【2】关键操作
    • 【3】redis使用跳表原因
    • 【4】特性

1、背景

redis中的跳表是一种有序数据结构,主要用于实现有序集合(zset)。跳表通过多级索引实现高效查找(平均O(logN)时间复杂度),同时保持插入和删除的高效性,下面就来讲解一下跳表(redis版本6.2.18)的底层结构。

2、跳表

【1】底层结构

跳表节点结构体如下:

typedef struct zskiplistNode {sds ele; //存储的元素double score; //排序分值,节点按score升序排列struct zskiplistNode *backward; //后向指针(单向链表,用于从尾到头遍历)struct zskiplistLevel {struct zskiplistNode *forward; //前向指针unsigned long span; //当前节点到下一个节点的跨度} level[]; //层级数组
} zskiplistNode;

跳表结构体如下:

typedef struct zskiplist {struct zskiplistNode *header, *tail; //指向跳表节点的头尾节点(头节点是虚拟节点,不存储数据)unsigned long length; //跳表中元素数量int level; //跳表实际使用的最高层数
} zskiplist;

【2】关键操作

跳表的关键操作有如下几种:

1、查找:从高层开始向右遍历,若下一节点分值大于目标值,则下降一层
2、插入:随机生成节点层数,更新前后指针和跨度
3、删除:类似插入的逆向操作

【3】redis使用跳表原因

redis使用跳表而不使用红黑树因为:

1、平衡性:相比红黑树,跳表实现更简单,且支持范围查询
2、性能:与红黑树的查找/插入均为O(logN),但跳表更适合并发场景(Redis6.0后支持多线程)

【4】特性

跳表的特性如下:

特性说明
数据结构用途实现有序集合的核心数据结构之一
时间复杂度查找/插入/删除:平均O(logN),最坏O(N)
空间复杂度平均O(N)(每个节点需存储多级指针)
层数控制节点层数随机生成,高层稀疏,低层密集
关键操作ZADD:插入节点并维护跳表结构- ZRANGE:按分值范围遍历- ZRANK:利用 span 计算排名
与红黑树相比优势:实现简单,天然支持范围查询- 劣势:空间占用略高
并发支持Redis 6.0+ 多线程模式下,跳表操作仍为单线程(由主线程处理)

相关文章:

  • Pytorch分布式训练,数据并行,单机多卡,多机多卡
  • 深度学习中的正则化方法与卷积神经网络基础
  • HTB 赛季8靶场 - Puppy
  • 【MySQL】04.数据类型
  • PLC系统中开关量与模拟量信号解析
  • 【Java高阶面经】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战
  • 使用 Qt Designer 开发
  • 第41天-Python+Qt四屏播放器开发指南
  • 第12天-Python+Qt5开发实战:10大经典案例与深度解析
  • Qt 控件发展历程 + 目标(1)
  • Visual Studio 制作msi文件环境搭建
  • Word 转 HTML API 接口
  • RK3568 OH5.1 源码编译及问题
  • 华为云鲲鹏型kC2云服务器——鲲鹏920芯片性能测评
  • LLM笔记(十)vLLM(1)PagedAttention论文笔记
  • 汇川PLC通过Profinet转ModbusTCP网关读取西门子PLC数据案例
  • 足式机器人经典控制常用的ROS库介绍
  • SpringBoot与GeoHash整合,实现骑手就近派单功能
  • 离线环境破局:聚客AI无外网部署Dify的依赖镜像打包与增量更新方案
  • 前端开发——前端样式BUG调试全指南2025终极版
  • 焦点访谈丨售假手段又翻新,警惕化肥“忽悠团”的坑农套路
  • 欧盟就逐步放松对叙利亚制裁达成一致
  • 王毅将出席《关于建立国际调解院的公约》签署仪式
  • 又是“9+2”复式票,浦东退休阿姨擒大乐透1153万头奖
  • 安徽凤阳通报鼓楼瓦片脱落:去年3月维修竣工,已成立调查组
  • 新华每日电讯:把纪律的螺丝拧得紧而又紧