【Redis系列3】Redis列表对象之linkedlist(双端列表)和ziplist(压缩列表)及quicklick(快速列表)实现原理分析

listNode *head;//头节点

listNode *tail;//尾节点

void *(*dup)(void *ptr);//节点值复制函数

void (*free)(void *ptr);//节点值释放函数

int (*match)(void *ptr, void *key);//节点值对比函数

unsigned long len;//节点数量

} list;

Redis中对linkedlist的访问是以NULL值为终点的,因为head节点的prev节点为NULL,tail节点的next节点为NULL。

所以,同样的,在Redis3.2之前我们可以得到如下简图:

在这里插入图片描述

PS:想要详细了解dictEntryredisObject对象以及编码相关知识的的可以点击这里

ziplist


ziplist是为了节省内存而开发的一种压缩列表数据结构,后面讲述的哈希数据类型底层也用到了ziplist

ziplist是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个ziplist可以包含任意多个entry,而每一个entry又可以保存一个字节数组或者一个整数值。

ziplist和linkedlist最大的区别是ziplist不存储指向上一个节点和下一个节点的指针,存储的是上一个节点的长度和当前节点的长度,牺牲了部分读写性能来换取高效的内存利用率,是一种时间换空间的思想。

ziplist适用于字段个数少和字段值少的场景。

ziplist存储结构

ziplist的组成结构为:

在这里插入图片描述

| 属性 | 类型 | 长度 | 说明 |

| — | — | — | — |

| zlbytes | uint32_t | 4字节 | 记录压缩列表占用内存字节数(包括本身所占用的4个字节) |

| zltail | uint32_t | 4字节 | 记录压缩列表尾节点距离压缩列表的起始地址有多少个字节(通过这个值可以计算出尾节点的地址) |

| zllen | uint16_t | 2字节 | 记录压缩列表中包含的节点数量,当列表值超过可以存储的最大值(65535)时,次值固定存储216-1(65535),因此此时需要遍历整个压缩列表才能计算出真实节点数 |

| entry | 列表节点 | - | 压缩列表中的各个节点,长度由存储的实际数据决定 |

| zlend | uint8_t | 1字节 | 特殊字符0xFF(十进制255),用来标记压缩列表的末端(其他正常的节点没有被标记为255的,因为255用来标识末尾,后面可以看到,正常节点都是标记为254) |

entry存储结构

ziplist 中的每个 entry 都以包含两段信息的元数据作为前缀,每一个 entry 的组成结构为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值