之前相关联的文章:
redis学习之一SDS
redis学习之二双端链表
redis学习之三字典
redis学习之四skiplist
redis学习之五ziplist
redis学习之六对象
redis学习之七字符串对象

先再看一下redisObject的定义:

typedef struct redisObject{

//类型unsigned type:4;//编码unsigned encoding:4;//lru缓存淘汰机制信息unsigned lru:LRU_BITS;//援用计数器int refcount;//指向底层实现数据结构的指针void *ptr;

}robj;
字符串对象的编码能够是zilist或linkedlist。
编码的转换规则,当列表同时满足上面两个条件时应用ziplist编码,不满足则应用linkedlist。

  1. 列表对象保留的所有字符串元素长度都小于64字节。
  2. 列表对象保留的元素数量小于512个。

当执行了如此命令时:

redis> RPUSH numbers 1 "three" 5(integer) 3

应用ziplist编码的示意图:

应用linkedlist编码的示意图:

参考的文章有:
黄健宏的《Redis设计与实现》一书
须要阐明下的是这里的stringObject作了简化,格局能够参看redis学习之七字符串对象里的内容。