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

【Redis】快速列表结构

目录

  • 1、背景
  • 2、压缩列表
    • 【1】底层结构
    • 【2】特性
    • 【3】优缺点

1、背景

redis的quicklist(快速列表)是一个双向链表,其中每个节点都是一个ziplist(压缩列表)。这中结构结合了双向链表和压缩列表的优点,在内存使用和性能之间取得了平衡,接下来就来熟悉一下redis(6.2.18版本)的底层结构实现。

2、压缩列表

【1】底层结构

quicklist的底层结构如下:

typedef struct quicklist {quicklistNode *head; //指向头部节点quicklistNode *tail; //指向尾部节点unsigned long count; //所有ziplist中的条目总数unsigned long len; //quicklist节点数量int fill : QL_FILL_BITS; //单个ziplist的最大大小限制unsigned int compress : QL_COMP_BITS; //不压缩的节点深度unsigned int bookmark_count: QL_BM_BITS;quicklistBookmark bookmarks[];
} quicklist;typedef struct quicklistNode {struct quicklistNode *prev; //上一个节点指针struct quicklistNode *next; //下一个节点指针unsigned char *zl; //指向压缩列表的指针unsigned int sz; //ziplist的字节大小unsigned int count : 16; //ziplist中的条目数unsigned int encoding : 2;   /* RAW==1 or LZF==2 */unsigned int container : 2;  /* NONE==1 or ZIPLIST==2 */unsigned int recompress : 1; //是否被压缩过unsigned int attempted_compress : 1; /* node can't compress; too small */unsigned int extra : 10; //保留位
} quicklistNode;

向quicklist添加一个元素的时候,不会像普通的链表那样直接新建一个链表节点,而是会检查插入位置的压缩列表是否能够容纳该元素,如果能容纳就直接保存到quicklistNode结构里的压缩列表里,如果不能容纳,才会建一个新的quicklistNode结构。

【2】特性

quick的特性如下:

特性描述
数据结构双向链表 + 压缩列表的混合结构
节点存储每个节点存储一个压缩列表
内存效率通过压缩列表减少元素的内存开销
可配置性可配置单个ziplist的最大大小和压缩深度
灵活性支持从头部和尾部插入/删除
压缩支持可选择对中间节点进行压缩

【3】优缺点

优点缺点
内存使用效率高,特别是对小元素随机访问性能不如数组结构
插入和删除操作高效需要维护更复杂的结构
支持大列表的分片存储配置不当可能导致性能下降
可配置的压缩策略平衡内存和cpu压缩和解压缩需要额外cpu开销
保留了双向链表的灵活性节点分裂和合并可能增加复杂度
http://www.lryc.cn/news/2379939.html

相关文章:

  • 阿里巴巴 1688 数据接口开发指南:构建自动化商品详情采集系统
  • [SpringBoot]Spring MVC(2.0)
  • Golang的网络安全策略实践
  • STM32外设AD-轮询法读取模板
  • C++编程this指针练习
  • iOS音视频解封装分析
  • 突破智能驾舱边界,Imagination如何构建高安全GPU+AI融合计算架构
  • DeepSeek 如何实现 128K 上下文窗口?
  • 云计算简介:从“水电”到“数字引擎”的技术革命
  • 计算圆周率 (python)
  • Python 实现图片浏览和选择工具
  • Python实现的在线词典学习工具
  • ES常识9:如何实现同义词映射(搜索)
  • BGP综合实验(2)
  • java实现poi-ooxml导出Excel的功能
  • 代码随想录算法训练营 Day51 图论Ⅱ岛屿问题Ⅰ
  • 【占融数科-注册/登录安全分析报告】
  • 【CF】Day62——Codeforces Round 948 (Div. 2) CD (思维 + LCM + 枚举因数 | 思维 + 哈希)
  • 基于requests_html的python爬虫
  • 循环神经网络:捕捉序列数据中的时间信息
  • 第35周Zookkeeper+Dubbo 面试题精讲
  • 聊聊更新中断和更新事件那些事儿
  • STM32:按键模块 传感器模块 以及 相关C语言知识(详细讲解)
  • C++23 std::mdspan:多维数组处理新利器
  • 基于高德MCP2.0的智能旅游攻略系统设计与实现
  • 【时时三省】(C语言基础)用函数实现模块化程序设计
  • Flink流处理:实时计算URL访问量TopN(基于时间窗口)
  • 初识函数------了解函数的定义、函数的参数、函数的返回值、说明文档的书写、函数的嵌套使用、变量的作用域(全局变量与局部变量)
  • java collection集合特点知识点详解
  • ngx_http_realip_module 模块概述