【《Redis深度历险》读书笔记(2)】源码(1-4):探索字符串、字典、压缩列表(ziplist)、快速列表(quicklist)内部结构

【时间】2021.11.17

【题目】【《Redis深度历险》读书笔记(2)】源码(1-4):探索字符串、字典、压缩列表(ziplist)、快速列表(quicklist)内部结构

本栏目是《Redis深度历险:核心原理和应用实践》的读书笔记。

目录

一、简介

二、一些重点图

1、SDS的结构

 2、SDS的两种编码方式

 3、dict的内部结构(包含2个HashTable)

1)dict的内部结构

2)HashTable结构

 4、zipList内部结构

 1)zipList

 2)entry结构

5、IntSet 小整数集合

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(快速列表)实现原理分析》​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值