redis源码剖析(基础数据结构篇)——ziplist
ziplist是什么东西?它又是干什么用的呢?
简单的说,ziplist是redis实现的一个链表结构体,它的主要特点是极其的节省空间。根据它的特性,我们也能很容易的推断出,这东西主要是用来节省内存空间的。
我们知道,redis是一个内存型数据库。这样的定位意味着redis必须尽量减少内存的使用量,以增大其处理数据的能力。仔细阅读源码,我们也会发现,redis在节省内存方面做了很大的工作,ziplist就是redis用于节省内存的一种方式。它在redis应用广泛,redis基础类型hash、list和zset的实现中都有它的身影,此外redis持久化实现也应用到了该结构体。
一、ziplist的真实内存布局
为了节省内存,ziplist没有直接存储结构体,因为结构体有对齐的问题,会浪费一部分内存空间。另外ziplist的内存布局以bit为单位,这一点,用结构体也无法实现。
1、ziplist整体结构
ziplist从实质上讲,就是一个具有类似双向链表结构的字节流,它的存储空间连续,由链表头、链表体与结束标志组成。如下图所示:
图1 ziplist结构图
zlbytes、zltail和zllen字段构成链表头,entry字段表示真正的链表节点,entry的集合就是链表体,zlend是结束标志,为固定值255。
zlbytes字段:4字节,记录这个ziplist结构的总长度,单位是字节。
zltail字段:4字节,记录最后一个entry的偏移地址。这个字段有点像链表中的尾指针,它可以让我们迅速的找到链表的尾部,在