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

Redis的ZipList、SkipList和ListPack之间的区别

将这三种数据结构放在一起比较,是因为它们都是 Redis 实现 ZSet 的核心数据结构。

在Redis 7.0之前,ZSet 主要采用 ZipList 和 SkipList 两种结构实现。而自Redis 7.0起,ZipList被ListPack取代,因此当前ZSet的核心实现变为ListPack和SkipList。

其中SkipList是长期存在的实现方式,我们先来看它的特性。

SkipList(跳表)

跳表是一种基于链表的多层索引结构,通过在基础链表上增加多级索引来提升查询效率。相比普通链表,跳表能够在 O(log N) 时间复杂度内完成查找、插入和删除操作,并支持高效的范围查询(如 ZRANGEBYSCORE 等命令)。

优势:

  • 所有核心操作(插入/删除/查找)的时间复杂度均为O(log N)
  • 特别适合范围查询场景

不足:

  • 内存占用较高(需要维护多级指针)

ZipList(压缩列表)

ZipList采用连续内存存储方式,所有元素紧密排列,在小数据量时能显著减少内存使用。

优势:

  • 内存利用率极高(紧凑存储)
  • 适合小规模数据存储

不足:

  • 查询、插入和删除都是O(N)时间复杂度
  • 存在级联更新风险

正是由于这些特性差异,Redis 会在元素较少时使用 ZipList,数据量增大后自动转换为 SkipList。

ListPack(紧凑列表)

ListPack 是Redis 5.0引入的新型高效数据结构(7.0+版本正式替代 ZipList ),专为解决 ZipList 和 SkipList 的某些局限性而设计。

特点:

  • 适用于小型有序集合、列表和哈希
  • 比 ZipList 更灵活、适应性更强
  • 完美规避了级联更新问题

对比总结

特性SkipListZipListListPack
设计目标高效范围查询内存紧凑解决级联更新
内存布局多层链表连续内存块连续内存块
查询复杂度O(log N)O(n)O(n)
插入复杂度O(log N)O(1)~O(n²)O(1)
删除复杂度O(log N)O(1)~O(n²)O(1)
内存占用极低
版本支持全版本≤6.2≥5.0 (7.0+默认)
核心优势有序访问高效小数据内存优化无级联更新
主要缺点内存占用高级联更新范围查询效率低
适用场景有序集合(ZSet)小型Hash/Set/ZSet全类型小规模存储
http://www.lryc.cn/news/607468.html

相关文章:

  • 在Alpine Linux上配置Redis使用NFS存储的完整指南
  • 李宏毅深度学习教程 第4-5章 CNN卷积神经网络+RNN循环神经网络
  • 每天一点跑步运动小知识
  • 逻辑回归算法 银行贷款资格判断案例,介绍混淆矩阵与正则化惩罚
  • AG-UI 协议全面解析--下一代 AI Agent 交互框架医疗应用分析(下)
  • Python 项目路径配置完全指南
  • 51单片机入门:模块化编程
  • C#常见的转义字符
  • 智能Agent场景实战指南 Day 29:Agent市场趋势与前沿技术
  • 31. 伪类和伪元素区别
  • 板卡型授时设备的优势总结.北斗pcie对时装置,北斗双模pcie授时板卡,双模pcie授时板卡
  • 二建机电工程专业都考哪些知识点?
  • WordPress 前端显示英文,后台显示中文的设置
  • 前端SWR策略:优化数据请求
  • 电商项目_性能优化_数据同步
  • Altium 移除在原理图之外的元器件
  • Linux权限提升
  • 【CDH × Docker】一次测试部署,N 次复用的环境镜像方案
  • Qt结合ffmpeg实现图片参数调节/明亮度对比度饱和度设置/滤镜的使用
  • 菜鸟教程Shell笔记 数组 运算符 echo命令
  • 一文了解 `package.json` 和 `package-lock.json`文件
  • vscode cursor配置php的debug,docker里面debug
  • 在线免费的AI文本转语音工具TTSMaker介绍
  • 流式编程终端操作
  • 【Halcon 】Halcon 实战:如何为 XLD 模板添加极性信息以提升匹配精度?
  • 32. flex 的子元素可以浮动吗
  • 三星固态硬盘PM1643A停产后,PM1653能代替PM1643A吗?有兼容性问题吗?
  • 【PHP】接入百度AI开放平台人脸识别API,实现人脸对比
  • TCP RTO 与丢包检测
  • VS Code 插件开发教程