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

说明:本文是基于redis2.9版本

先再看一下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个。

上面两个值可以根据list-max-ziplist-value和list-max-ziplist-entries进行调整。

当执行了如下命令时:

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

使用ziplist编码的示意图:
image.png
使用linkedlist编码的示意图:
image.png

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


步履不停
38 声望13 粉丝

好走的都是下坡路