关于《Redis设计与实现》读书笔记redis
链表做为一种很是友好的数据结构在不少高级编程语言中都有内置,然而C语言中没有没有链表这种数据结构,在redis中redis自行设计了一套链表数据结构用于存储链式数据,redis中设计了一个双端链表,该链表跟普通链表没什么大的区别这里就不详细描述,本文主要介绍redis中另外一种链式数据结构压缩列表。编程
压缩列表(ziplist)是用一些列特殊的编码构成的内存区域,是redis为了节省内存而设计的,ziplist中每一个节点能够保存一个长度受限的字符数组(不以 \0
结尾的 char
数组)或者整数,redis中ziplist结果以下图所示:数组
area |<---- ziplist header ---->|<----------- entries ------------->|<-end->| size 4 bytes 4 bytes 2 bytes ? ? ? ? 1 byte +---------+--------+-------+--------+--------+--------+--------+-------+ component | zlbytes | zltail | zllen | entry1 | entry2 | ... | entryN | zlend | +---------+--------+-------+--------+--------+--------+--------+-------+ ^ ^ ^ address | | | ZIPLIST_ENTRY_HEAD | ZIPLIST_ENTRY_END | ZIPLIST_ENTRY_TAIL
一个 ziplist 能够包含多个节点,每一个节点能够划分为如下几个部分:数据结构
area |<------------------- entry -------------------->| +------------------+----------+--------+---------+ component | pre_entry_length | encoding | length | content | +------------------+----------+--------+---------+
pre_entry_length:前一个节点的长度,有个这个值就能够直接经过指针计算直接跳到上一个节点。编程语言
encoding 和 length:encoding 和 length保存着节点字符串的类型及其长度。编码
content:content保存着节点的内容,长度和类型由encoding和length决定。设计