之前相关联的文章:
redis学习之一SDS
redis学习之二双端链表
redis学习之三字典
redis学习之四skiplist
说明:本文是基于redis2.9版本
ziplist是redis为了提高内存使用率而构造的一种数据结构,它占用一整块连续的内存块,普通的链表在内存中是非连续的通过指针连接,不过它的缺点是会产生内存碎片;而对于数组来说它也是占用一整块连续的内存空间,但所存的数据类型却只能是相同的,ziplist的每个节点保存一个字节数组或者一个整数值。
我们先来看下ziplist的组成部分:
zlbytes:记录整个ziplist占用的内存字节数,在进行内存重新分配时或计算zllen位置是使用。这 里顺便提一下,redis时好多数据结构都记录了当前数据结构的大小,虽然会占用一点空 间,但redis的内存容量是允许这么做的,且在整体进行内存统计的时候有很有帮助的 。
zltail:记录ziplist尾节点到头节点的字节数,通知它可以快速定位到尾节点。
zllen:记录ziplist包含的节点数量。
entry:ziplist各节点,节点tayc由节点保存的内容决定。
zlend:特殊值0xFF(十进制255),用于标识ziplist的末端。
再来看下entry的组成部分:
previous_entry_length:记录前一个节点的长度,可以通过指针运算,根据当前节点起始地址计算出前一个节点的起始地址。
encoding:保存数据的类型及长度。
content:节点值可以是一个字节数组或整数,值的类型和长度由节点的encoding属性决定。
看个示例:
previous_entry_length值为0x05,说明前一个节点长度为5。
encoding值为00001011,高两位00说明节点保存的是一个字节数组(11为整数类型);后六位为001011说明字节数组长度是11。
content:节点保存的内容。
到现在为止,先后写了SDS、双端链表、字典、skiplist、ziplist这五种数据结构,而redis并不没有直接使用这几种数据结构,而是在这些数据结构的基础上构造了一个对象系统,分别为字符串对象、列表对象、哈希对象、集合对象与有序集合对象这五种对象,每个对象都会使用前面一种或多种数据结构,后面的文章会讲到redis里的这些对象。
本文参考的有:
黄健宏的《Redis设计与实现》一书
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。