ziplist 压缩列表---list结构,hash结构,zset结构底层数据结构
一. 存储数据及限制
1. list结构,存储:将存储数据压入表尾
列表对象所保存的所有字符串元素长度小于64字节
列表对象保存的元素数量小于512个
2. hash结构,存储:先将保存了键的节点压入表尾,再将保存了值得节点压入表尾
键和值的字符串长度都小于64字节
键值对数量小于512个
3. zset结构,存储:第一个节点存储元素,第二个节点存储分值
元素数量小于128个
元素成员长度都小于64字节
二. 压缩列表结构
ziplist_bytes ziplist_tail_offset ziplist_length zlentry ... 0xFF(255)
ziplist_bytes: 四个字节,记录了整个压缩列表总共用了多少字节数
ziplist_tail_offset: 四个字节,记录了整个压缩列表第一个节点到最后一个节点跨越了多少个字节,通过这个字段可以迅速定位到列表最后一个位置
ziplist_length: 两个字节,记录了整个压缩列表中总共包含了几个zlentry节点
zlentry: 非固定节点,记录的是单个的节点,这是一个复合结构
0xFF: 一个字节,十进制的值为255,标志压缩列表的结尾
三. zlentry结构
previous_entry_length encoding content
previous_entry_length: 每个节点会使用一个或者五个字节来描述前一个节点占用的总字节数,如果前一个字节占用的总字节数小于254,那么就用一个字节存储,反之如果前一个字节占用的总字节数超过了254,那么一个字节就不够存储了,这里会用五个字节存储,并将第一个字节的值存储为固定值,254用于区分
encoding: 压缩列表可以存储16位,32位,64位的整数和字符串,用来区分后面的content字段中存储的到底是哪种内容,值最高位为:00,01,10为字节数组,11为整数编码
content: 存储的是具体的二进制内容,整数或者字符串
四. 结构设计思路
压缩列表:顾名思义是为了节约内存,这种思路取于数组的存储思路。但是数组要求每个元素的大小相同,如果要存储不同长度的字符串,那我们就要用最大长度的字符串大小作为元素的大小,会浪费部分空间。
数组的优势在于占用一片连续的空间可以很好的利用CPU缓存访问数据。如果我们想要保存这种优势,又想节省存储空间我们可以对数组进行压缩
因为在遍历的时候不知道每个元素的的大小,所以给每个节点增加一个length属性