下一章:Redis-数据结构02-简单动态字符串(sds)
定义:压缩列表ziplist本质上就是一个字节数组,可以包含多个元素,每个元素只能是一个字节数组或一个整数,等同于java当中的ArrayList
一:下图是压缩列表的数据结构图
zlbytes:表示整个ziplist有多少字节,占4个字节,因此压缩列表最多有2的32次方-1个字节。
zltail:压缩列表尾元素相对于压缩列表起始地址的偏移量,占4个字节。
zllen:压缩列表的元素个数,占2个字节。必须遍历整个压缩列表才能获取到元素个数。
entryN:压缩列表中的每个元素(关于entry下文有介绍)
zlend:压缩列表的结尾,占1个字节,恒为0xFF。二:列表中的元素(entry)
压缩列表中元素(entry)的数据结构图
previous_entry_length:表示前一个元素的字节长度,假设已知当前元素的首地址为p,那么p减previous_entry_length就是前一个元素的首地址,从而实现压缩列表从尾到头的遍历。
encoding:表示content字段存储的数据类型,类型只能是下图9种之一,没有为什么,redis就是这么规定的
content:实际存储的内容,只能是整数或者字节数组
根据上面的entry结构图,redis将其结构更细致的抽象出了结构体,之所以说更细致是因为结构体中的字段比图中的要多出了几个,具体如下
压缩列表元素(entry)的结构体
typedef struct zlentry {
//previous_entry_length的长度
unsigned int prevrawlensize;
//previous_entry_length的内容
unsigned int prevrawlen;
//encoding的长度
unsigned int lensize;
//content的长度(没错就是content)
unsigned int len;
//content的数据类型
unsigned char encoding;
//表示当前元素的首部长度,即prevrawlensize+lensize之和
unsigned int headersize;
//当前元素首地址
unsigned char *p;
} zlentry;
下一章:Redis-数据结构02-简单动态字符串(sds)