redis对象之列表对象

承接上文redis对象之字符串对象

参考文献:黄健宏《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会发生编码转换,将压缩列表中的所有元素都保存到一个双端链表中

你可能感兴趣的:(redis对象之列表对象)