0
点赞
收藏
分享

微信扫一扫

Redis-数据结构01-压缩列表(ziplist)


下一章:​​Redis-数据结构02-简单动态字符串(sds)​​

定义:压缩列表ziplist本质上就是一个字节数组,可以包含多个元素,每个元素只能是一个字节数组或一个整数,等同于java当中的ArrayList

一:下图是压缩列表的数据结构图

Redis-数据结构01-压缩列表(ziplist)_java


zlbytes:表示整个ziplist有多少字节,占4个字节,因此压缩列表最多有2的32次方-1个字节。

zltail:压缩列表尾元素相对于压缩列表起始地址的偏移量,占4个字节。

zllen:压缩列表的元素个数,占2个字节。必须遍历整个压缩列表才能获取到元素个数。

entryN:压缩列表中的每个元素(关于entry下文有介绍)

zlend:压缩列表的结尾,占1个字节,恒为0xFF。二:列表中的元素(entry)

压缩列表中元素(entry)的数据结构图

Redis-数据结构01-压缩列表(ziplist)_java_02


previous_entry_length:表示前一个元素的字节长度,假设已知当前元素的首地址为p,那么p减previous_entry_length就是前一个元素的首地址,从而实现压缩列表从尾到头的遍历。

encoding:表示content字段存储的数据类型,类型只能是下图9种之一,没有为什么,redis就是这么规定的

Redis-数据结构01-压缩列表(ziplist)_数据结构_03


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)​​


举报

相关推荐

0 条评论