redis set类型数据结构字典

278 阅读2分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

5redis set类型数据结构字典

字典又称符号表,用于保存键值对的抽象数据结构

set类型 和hash类型都有用到字典

字典是使用哈希表作为底层实现,一个哈希表可以有多个哈希表节点,每个哈希表节点就保存了字典的一个键值对。

dict.h定义了哈希表结构:

/*
 * 哈希表
 */
typedef struct dictht {

    // 哈希表节点指针数组(俗称桶,bucket)
    dictEntry **table;      

    // 指针数组的大小
    unsigned long size;     

    // 指针数组的长度掩码,用于计算索引值
    unsigned long sizemask; 

    // 哈希表现有的节点数量
    unsigned long used;     

} dictht;

其中dictEntry结构中保存着一个键值对:

/*
 * 哈希表节点
 */
typedef struct dictEntry {

    // 键
    void *key;

    // 值
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
    } v;

    // 链往后继节点
    struct dictEntry *next; 

} dictEntry;

key属性保存着键值对中的键,v属性保存着键值对中的值,next属性指向另一个哈希表节点的指针,这个指针将多个哈希值相同的键值对连接在一起,来解决键冲突的问题

字典的结构定义:

/*
 * 字典
 *
 * 每个字典使用两个哈希表,用于实现渐进式 rehash
 */
typedef struct dict {

    // 特定于类型的处理函数
    dictType *type;

    // 类型处理函数的私有数据
    void *privdata;

    // 哈希表(2个)
    dictht ht[2];       

    // 记录 rehash 进度的标志,值为-1 表示 rehash 未进行
    int rehashidx;

    // 当前正在运作的安全迭代器数量
    int iterators;      

} dict;

ht属性是包含两个项的数组,数组中的每个项都是一个dictht哈希表,一般情况下,字典使用ht[0],ht[1]在对ht[0]哈希表进行rehash时使用。