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

先再看一下redisObject的定义:

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

汇合对象的编码能够是intset或hashtable。当同时满足上面两个条件时会应用intset,不满足时应用hashtable:

  1. 保留的所有元素都是整数。
  2. 只在的元素数量不超过512个(能够通过set-max-intset-entries配置进行调整)

当执行了上面命令后:

redis> SADD numbers 1 3 5 (integer) 3

上面是intset编码存储的格局:

当执行了上面命令后:

redis> SADD test "apple" "cherry" "yes"(integer) 3

上面是hashtable编码存储的格局:

参考的文章有:
黄健宏的《Redis设计与实现》一书