redis-数据类型-字典-结构

99 阅读1分钟

redis数据类型-字典-结构

实现结构

hash表

// redis字典所使用的 hash表
typedef struct dictht {
    dictEntry **table; // hash表数组,数组的每个元素都是指向 dictEntry
    unsigned long size; // hash表的大小,初始长度为0
    unsigned long sizemask; // hash表的大小掩码,用于计算索引值,总是等于size-1
    unsigned long used; // 该hash表已经有的所有bucket的链表的节点数量。
} dictht;

// redis的 hash表节点
typedef struct dictEntry {
    void *key; // key
    union { // value
        void *val; // 指向了实际值的指针。
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next; // 将多个hash值相同的键值,联系在一起,指向下一个hash节点,形成链表。
} dictEntry;

redis字典

// 结构体中定义函数
typedef struct dictType {
    uint64_t (*hashFunction)(const void *key); // 计算hash函数
    void *(*keyDup)(void *privdata, const void *key); // 复制key函数
    void *(*valDup)(void *privdata, const void *obj); // 复制val的函数
    int (*keyCompare)(void *privdata, const void *key1, const void *key2); // 比较key的函数
    void (*keyDestructor)(void *privdata, void *key); // 销毁kkey的析构函数
    void (*valDestructor)(void *privdata, void *obj); // 销毁value的析构函数
} dictType;


// redis中的字典
typedef struct dict {
    dictType *type; // dictType包含了自定义函数,外部可以自己实现函数的逻辑,可以接收任意的k-v
    void *privdata; // 传给dict的私有数据
    dictht ht[2];		// 2个是因为 另外一个用来做 rehash的使用的。	
    long rehashidx; //  rehash的进度,-1,表示此时没有在进行rehash,
    unsigned long iterators; // 正在运行的迭代的迭代器数量
} dict;

图解

dict类型结构图.png