redis使用的数据结构包括:简单动态字符串(sds)、双端链表、字典、压缩列表、整数集合等。但是并没有直接使用,而是在此基础上封装了一套对象系统,5种类型的对象:字符串对象、哈希对象、列表对象、集合对象、有序集合对象。

引用计数

对象系统实现基于引用计数技术的内存回收机制;
基于引用计数的对象共享机制,多个键共享一个对象来节约内存。

对象结构

对象结构由server.h/redisObject表示:

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    int refcount;

    // 指向底层数据结构
    void *ptr;    
} robj;

type :保存对象的类型,由一个常量表示。
使用type命令可以查看对象的类型

编码与底层实现

对象的ptr 指针指向底层数据结构,而数据结构由encoding属性决定。
每个编码对应一个数据结构,但是每个对象都至少使用两种编码。如图
请输入图片描述

请输入图片描述

使用object encoding命令查看对象使用的编码

标签: none

添加新评论