把两个放在一起说主要是两个都是为了内存的压缩,使得将所有的东西都放在了char*的数组中。根据自定义的一些编码规则,实现增删改查的操作。里面涉及大量的位操作,自定义的decode(解码)和encoding(编码)的操作。我觉把原理与数据结构理解一下就好,具体的位操作,实现起来有点复杂。为了压缩空间,redis把几乎每一bit的空间使用了。
ziplist数据结构
其本质是一个超长的字符串。
| zlbytes | zltail | zllen | .................................| zlend |
先介绍基本结构。
zlbytes (4字节 32位)存储所有的字节数。使用四个字节存储 即32bits 是一个uint32_t 即最大值为4294967295
zltail (4 字节 32位) 存储尾元素距离起始元素的偏移值
zllen (2字节 16位) 存储list的元素个数
zlend (1字节 0xFF 即255 ) 由于255被使用了 后面都会以254 作为一个判断标