博客
关于我
一套打通Redis(2)--列表的底层实现-链表、压缩链表与快速列表
阅读量:132 次
发布时间:2019-02-26

本文共 1477 字,大约阅读时间需要 4 分钟。

Redis中的链表与压缩列表优化

在《Redis的设计与实现》中,链表和压缩列表是Redis内存管理的核心结构,特别是在列表操作和哈希存储中发挥着重要作用。以下是对这些数据结构的详细分析。


一、链表

链表是一种非常常用的数据结构,Redis为了实现高效的节点重排和顺序访问,自行设计了一个链表结构。列表类型(List)在Redis中使用了链表结构,每个节点包含一个整数值。此外,发布与订阅、慢查询、监视器等功能也依赖于链表。

链表的每个节点定义如下:

typedef struct listNode {    struct listNode *prev;  // 前置节点    struct listNode *next;  // 后置节点    void *value;          // 数据};

链表的整体结构由以下部分组成:

typedef struct list {    listNode *head;       // 头节点    listNode *tail;       // 尾节点    void *(*dup)(void *ptr); // 节点复制函数    void (*free)(void *ptr); // 节点释放函数    int (*match)(void *ptr, void *key); // 节点值对比函数    unsigned long len;     // 节点数量};

Redis中的链表具有以下特点:

  • 双端性:支持通过prevnext指针访问前置和后置节点。
  • 无环性:表头节点的prev指针和表尾节点的next指针均指向NULL
  • 计数器:维护一个len属性来记录节点数量。
  • 多态性:使用void类型,支持任意类型存储。

因此,Redis中的链表是一个双向不循环的链表结构。


二、压缩列表(ziplist)

压缩列表是Redis3.2之前用于列表键和哈希键的底层实现。其核心目标是通过压缩内存,提高存储效率。以下是压缩列表的工作原理和优点:

  • 适用场景
    • 列表键仅包含少量列表项时,Redis使用压缩列表。
    • 哈希键仅包含少量键值对,且键值为小整数或长度较短时,使用压缩列表。

压缩列表通过固定化每个节点的大小,避免内存碎片和预留空间的浪费。每个节点包含以下信息:

previous_entry_length: 前一个节点的长度(1或5字节,根据长度大小)encoding: 节点内容类型及长度content: 节点值

压缩列表的插入和删除操作会引发连锁更新现象。例如,插入一个大小超过254字节的节点,会导致后续所有节点的previous_entry_length属性需要更新。这种情况虽然罕见,但会影响性能。


三、快速列表(quicklist)

在Redis3.2之后,快速列表(QuickList)取代了压缩列表,成为列表键的默认实现。快速列表结合了双向链表和压缩列表的优点,解决了它们的局限性:

  • 双向链表的优点

    • 插入和删除操作复杂度较低。
    • 内存开销较大,容易产生碎片。
  • 压缩列表的优点

    • 存储效率高。
    • 修改操作复杂度较高,尤其是插入和删除。

快速列表通过将链表和压缩列表的优点相结合,设计了一种高效的数据结构。其核心思想是将链表分为固定大小的块(称为“扩展块”),每个块记录自身的类型和长度。这种设计既节省了内存空间,又支持高效的插入和删除操作。


通过以上分析可以看出,链表、压缩列表和快速列表各有优劣,Redis根据具体需求选择合适的数据结构,确保高效的内存管理和操作性能。

转载地址:http://gipk.baihongyu.com/

你可能感兴趣的文章
NLog 自定义字段 写入 oracle
查看>>
NLog类库使用探索——详解配置
查看>>
NLP 基于kashgari和BERT实现中文命名实体识别(NER)
查看>>
NLP 模型中的偏差和公平性检测
查看>>
Vue3.0 性能提升主要是通过哪几方面体现的?
查看>>
NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
查看>>
NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
查看>>
NLP三大特征抽取器:CNN、RNN与Transformer全面解析
查看>>
NLP学习笔记:使用 Python 进行NLTK
查看>>
NLP度量指标BELU真的完美么?
查看>>
NLP的不同研究领域和最新发展的概述
查看>>
NLP的神经网络训练的新模式
查看>>
NLP采用Bert进行简单文本情感分类
查看>>
NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
查看>>
NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道
查看>>
NLP:使用 SciKit Learn 的文本矢量化方法
查看>>
nmap 使用方法详细介绍
查看>>
Nmap扫描教程之Nmap基础知识
查看>>
nmap指纹识别要点以及又快又准之方法
查看>>
Nmap渗透测试指南之指纹识别与探测、伺机而动
查看>>