nber1994



redis数据结构-对象

August 9, 2019

redis数据结构-对象

对象的类型与编码

当创建一个键值对时,至少会创建两个对象,一个是键的字符串对象,另一个是值的对象

typedef struct redisObject {
    //类型
    unsigned type:4;
    //编码
    unsigned encoding:4;
    //指向底层实现数据结构的指针
    void *ptr;
} robj;

类型

对象的type的值:

编码和底层实现

encoding来决定ptr指向哪种底层数据结构

不同的type对应的encoding

不为某种对象绑定特定的数据结构,极大的提高了redis对象的灵活性

字符串对象

?? 为什么

采用embstr的优势

??那为什么不都存为embstr

编码的转化

int编码和embstr编码有时会转化为raw,比如append命令

列表对象

哈希对象

编码转化

集合对象

编码转换

intset只能保存一定数量的整数元素

集合的交集,并集,差集操作

有序集合对象

typedef struct zset {
    zskiplist *zsl;
    dict *dict;
} zset;
- 当使用zskiplist实现时,跳跃表的每个节点对应一个有序集合的元素,节点的值存储有序集合的分值,节点的成员对象存储有序集合元素的值的字符串对象
- 根据跳跃表可以实现有序集合的范围查找
- 除此之外,有序集合还维护了一个字典结构,以集合元素作为字典的键,分值作为键值。来提供O(1)的根据对象查询分支的能力
- 有序集合的每个元素对应一个字符串对象,而每个分值对应一个double类型的浮点数
- zskiplist和dict通过指针来共享集合元素的成员和分值

编码的转换

类型检查和命令多态

类型检查

命令多态

内存回收

对象共享

对象的空转时长

redisObject

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    void *ptr;
    int refcount;
    unsigned lru:22;
} redisObject;

重点回顾