这是《redis 七种内部数据结构》:https://www.cnblogs.com/christmad/p/11364372.html 的第四篇

 

通过这篇笔记你将了解到:

  (1)ziplist 是 redis 中用来压缩数据的结构,ziplist 定义了在小字节宽度(1-4字节)的编码,值越小的数据就用越小的编码宽度来存储。

  (2)压缩编码的魔法在于 encoding 字段的第一个字节,8bit 可表示的编码种类有 256 种,用来表示小数和小字符串的种类算是绰绰有余了。redis ziplist中规定 encoding 第一个字节最高两位为 11 时数据为整型(integer),具体6种 integer 编码方式笔记中有详细记录。而第一个字节最高两位还有3种情况,00xxxxxx、01xxxxxx、10xxxxxx,这三种情况的编码表示数据为字符串,具体编码方式笔记中也有记录。

  (3)变长编码的好处:对小值的数据使用压缩编码可以节省空间。如果数据长度总是有规律的,并且值范围比较收拢,那么编码方式就可能比较统一,对于这类比较“固定”且有规律的格式,计算机处理起来是比较快的。就好比顺序读总比随机读快的道理一样。

  变长编码的坏处:修改肯定会导致重新分配内存。如果是在头部或尾部修改,有可能进行优化。但大部分情况下的修改都是比较复杂的数据拷贝操作。

  (4)redis 常见数据结构中内部实现使用了 ziplist 的有三个:Hash,List 和 Sorted Set。在数据量或数据小的时候采用 ziplist 降低内存占用,这是 redis 的一个特点

redis 内部数据结构 ziplist