【时间】2021.11.17
【题目】【《Redis深度历险》读书笔记(2)】源码(1-4):探索字符串、字典、压缩列表(ziplist)、快速列表(quicklist)内部结构
本栏目是《Redis深度历险:核心原理和应用实践》的读书笔记。
目录
6、quickList结构(zipList+LinkedList)
一、简介
本章主要主要介绍了Redis 字符串、字典、压缩列表(ziplist)、快速列表(quicklist)内部结构(底层实现)。
- 字符串 :简单动态字符串 SDS,一个带长度信息的字节数组(冗余数组)
- 字典(dict):包含两个HashTable的dict对象,便于进行"渐进式rehash"
- 压缩列表(ziplist):一块连续的内存空间,元素之间紧挨着存储,没有任何冗余空隙。zset 和 set对象在元素个数较少的时候,采用压缩列表进行存储,早期List在元素个数较少时也使用zipList,较多时使用linkedList。
- 快速列表(quicklist):Redis后期使用的List底层结构,结合了linkedList和zipList,即每个节点是zipList,节点间用双向指针串联。
二、一些重点图
1、SDS的结构
struct SDS<T> {
T capacity; // 数组容量
T len; // 数组长度
byte flags; // 特殊标识位
byte[] content; // 数组内容
}
2、SDS的两种编码方式
其中RedisObject对象头是:
struct RedisObject {
int4 type; // 4bits,类型
int4 encoding; // 4bits,编码方式(底层结构)
int24 lru; // 24bits,LRU 信息
int32 refcount; // 4bytes,引用计数
void *ptr; // 8bytes,对于64-bit system,对象指针
} robj;
3、dict的内部结构(包含2个HashTable)
1)dict的内部结构
2)HashTable结构
4、zipList内部结构
1)zipList
struct ziplist<T> {
int32 zlbytes; // 整个压缩列表占用字节数
int32 zltail_offset; // 最后一个元素距离压缩列表起始位置的偏移量,用于快速定位到最后一个
节点
int16 zllength; // 元素个数
T[] entries; // 元素内容列表,挨个挨个紧凑存储
int8 zlend; // 标志压缩列表的结束,值恒为 0xFF
}
2)entry结构
struct entry {
int<var> prevlen; // 前一个 entry 的字节长度(变长整型)
int<var> encoding; // 元素类型编码
optional byte[] content; // 元素内容
}
5、IntSet 小整数集合
6、quickList结构(zipList+LinkedList)
三、思维导图
四 、扩展阅读
1、hash算法:SipHash 算法流程
2、Redis系列(六)底层数据结构之字典
3、《ziplist、linkedlist 和 quicklist 的性能对比》
4、《Redis列表对象之linkedlist(双端列表)和ziplist(压缩列表)及quicklick(快速列表)实现原理分析》