Redis 提供了5种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),理解每种数据类型的特色对于redis的开发和运维很是重要。html
原文解析java
Redis 中的 list 是咱们常常使用到的一种数据类型,根据使用方式的不一样,能够应用到不少场景中。redis
上节**《闲扯Redis三》Redis五种数据类型之List型** 中说道,List类型有两种实现方式:运维
一、使用压缩列表(ziplist)实现的列表对象 二、使用双端链表(linkedlist)实现的列表对象ui
而且,留下了一个疑问?Redis列表何时会使用 ziplist 编码,何时又会使用 linkedlist 编码呢?编码
参见了《Redis设计与实现》,得出了一个结论: ziplist 与 linkedlist 之间存在着一种编码转换机制,当列表对象能够同时知足下列两个条件时,列表对象采用ziplist编码,不然采用linkedlist编码spa
(1)列表对象保存的全部字符串元素的长度都小于64字节;设计
(2)列表元素保存的元素数量小于512个;3d
注意 :以上两个条件的上限值能够在配置文件中修改 list-max-ziplist-value 选项和 list-max-ziplist-entries 选项,另外对于使用 ziplist 编码的列表对象,当以上两个条件中任何一个不能知足时,对象的编码转换操做就会执行,本来保存在压缩列表里面的全部列表元素都会被转移并保存到双端链表里面,对象的编码也从 ziplist 变为 linkedlist 。code
书中是这样说的,可是仍是要本身操做验证一下的,go!
咦,什么鬼,不是说 ziplist 和 linkedlist ,还有编码转换吗,咋一个都不是,这个 quicklist 是什么结构?看到这你们可能有一点懵逼,细品以后甚至想要动手:七哥,你TM是否是在忽悠我?
嗯,这个不要急,听我继续哔哔( 伪装冷静 )
先来看一下操做的redis的版本:
./redis-server --version
复制代码
版本显示:
再看一下,黄建宏老师**《Redis设计与实现》**第二版中对应的redis版本:3.0,查阅资料发现 redis 在 3.2 版本的时候,考虑到redis的空间存储效率和时间效率,引入了quicklist(快速列表)做为 list 的底层实现,原来是这样啊!
这就能说的通了,哈哈哈,下节我们就来看看这个 quicklist 到底是个什么啥,前面针对 3.0 版本的分析,看都看了,还能怎么办呢,权当作个了解了!
(1)(Redis 3.2 版本前)列表对象底层实现的方式,压缩列表(ziplist)与双端链表(linkedlist)存在转换
(2)(Redis 3.2 版本前)同时知足两个条件:列表对象保存的全部字符串元素的长度都小于64字节;列表元素保存的元素数量小于512个;列表对象采用 ziplist 编码,不然采用 linkedlist 编码
(3)(Redis 3.2 版本)考虑到 Redis 的空间存储效率和时间效率,引入了 quicklist(快速列表)做为 list 的底层实现
下节继续...