欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 【Redis】快速列表结构

【Redis】快速列表结构

2025/5/21 4:39:03 来源:https://blog.csdn.net/qq_45795794/article/details/148058357  浏览:    关键词:【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开销
保留了双向链表的灵活性节点分裂和合并可能增加复杂度

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词