承接上文redis对象之字符串对象
前言
列表对象是redis对象系统中五大对象之一,下面分析其具体的编码实现方式有哪些
编码实现
列表对象的编码实现有双端链表linkedlist和压缩列表ziplist两种
ziplist编码
ziplist编码的列表对象采用压缩列表作为底层实现,每个压缩列表节点保存一个列表元素
linkedlist编码
linkedlist编码的列表对象采用双端链表作为底层实现,每个双端链表节点node都保存了一个列表元素,而每一node元素其实又是一个字符串对象stringObject
需要注意的一点是字符串对象是redis对象系统中唯一一个会被其他四种对象嵌套的对象
那么以上两种编码方式具体对应何种使用场景呢?
ziplist
满足条件
列表对象里所有字符串元素的长度均小于64字节
列表对象保存的元素个数小于512个
以上条件必须同时满足,redis才会采用压缩列表作为列表对象的底层编码实现,当然,这两个条件上限值可以通过redis的配置文件中(list-max-ziplist-value和list-max-ziplist-entries)来修改
对于一个原本采用压缩列表实现的列表对象来说,如果其中任一条件不被满足,redis就会将原本保存在压缩列表中的所有元素转移到一个双端链表中,列表对象的编码实现encoding属性也会从ziplist变为linkedlist
总结
对于列表对象来说,其有两种底层编码实现方式,压缩列表和双端链表
当不在满足压缩列表的两个条件时,redis会发生编码转换,将压缩列表中的所有元素都保存到一个双端链表中