列表对象
列表对象的编码可以是 ziplist 或者 linkedlist 。
ziplist编码
ziplist 编码的列表对象使用压缩列表作为底层实现, 每个压缩列表节点(entry)保存了一个列表元素。
linkedList编码
linkedlist 编码的列表对象使用双端链表作为底层实现, 每个双端链表节点(node)都保存了一个字符串对象, 而每个字符串对象都保存了一个列表元素。
quickList编码
redis7之后的编码方式,整体上quickList是一个linkedList,而在linkedList中的每一个节点都是一个ziplist。
优点:
- 一个
Ziplist节点连续存储多个元素,比纯粹的双向链表(每个元素一个节点,包含前后指针)节省大量内存。简单来说就是数据密度变高了。 - 在保持链表两端操作高效的同时,减少了内存碎片,并且对列表中间部分的遍历也比纯链表有更好的缓存命中率。
现在ziplist被listpack替换了。
编码转换
当列表对象可以同时满足以下两个条件时, 列表对象使用 ziplist 编码:
- 列表对象保存的所有字符串元素的长度都小于
64字节; - 列表对象保存的元素数量小于
512个;
不能满足这两个条件的列表对象需要使用 linkedlist 编码。
对于使用 ziplist 编码的列表对象来说, 当使用 ziplist 编码所需的两个条件的任意一个不能被满足时, 对象的编码转换操作就会被执行: 原本保存在压缩列表里的所有列表元素都会被转移并保存到双端链表里面, 对象的编码也会从 ziplist 变为 linkedlist 。