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

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

先再看一下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编码存储的格式:
image.png

当执行了下面命令后:

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

下面是hashtable编码存储的格式:
image.png
hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含一个集合元素,而字典的值全被设置为NULL。
参考的文章有:
黄健宏的《Redis设计与实现》一书


步履不停
38 声望13 粉丝

好走的都是下坡路