之前相关联的文章:
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:
- 保留的所有元素都是整数。
- 只在的元素数量不超过 512 个(能够通过 set-max-intset-entries 配置进行调整)
当执行了上面命令后:
redis> SADD numbers 1 3 5
(integer) 3
上面是 intset 编码存储的格局:
当执行了上面命令后:
redis> SADD test "apple" "cherry" "yes"
(integer) 3
上面是 hashtable 编码存储的格局:
参考的文章有:
黄健宏的《Redis 设计与实现》一书