数据模型-对象-列表对象

列表对象的编码可以是ziplist或者linkedlist

ziplist编码

ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点(entry)保存了一个列表元素。举个例子,如果我们执行以下RPUSH命令,那么服务器将创建一个列表对象作为numbers键的值

在这里插入图片描述
如果numbers键的值对象使用的是ziplist编码,这个这个值对象将会是图8-5所展示的样子
在这里插入图片描述

ziplist编码的使用场景

当列表对象可以同时满足以下两个条件时,列表对象使用ziplist编码:

❑列表对象保存的所有字符串元素的长度都小于64字节;
❑列表对象保存的元素数量小于512个;

不能满足这两个条件的列表对象需要使用linkedlist编码。

动态转换为linkedlist 编码

以上两个条件的上限值是可以修改的,具体请看配置文件中关于list-max-ziplist-value选项和list-max-ziplist-entries选项的说明。

对于使用ziplist编码的列表对象来说,当使用ziplist编码所需的两个条件的任意一个不能被满足时,对象的编码转换操作就会被执行,原本保存在压缩列表里的所有列表元素都会被转移并保存到双端链表里面,对象的编码也会从ziplist变为linkedlist。

以下代码展示了列表对象因为保存了长度太大的元素而进行编码转换的情况
在这里插入图片描述
除此之外,以下代码展示了列表对象因为保存的元素数量过多而进行编码转换的情况:
在这里插入图片描述

linkedlist 编码

另一方面,linkedlist编码的列表对象使用双端链表作为底层实现,每个双端链表节点(node)都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素。

在这里插入图片描述

在这里插入图片描述

注意,linkedlist编码的列表对象在底层的双端链表结构中包含了多个字符串对象,这种嵌套字符串对象的行为在稍后介绍的哈希对象、集合对象和有序集合对象中都会出现,字符串对象是Redis五种类型的对象中唯一一种会被其他四种类型对象嵌套的对象。