微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Redis 设计与实现——字典

字典

字典中,一个键key和一个值value关联起来,这称为键值对。
字典中的每个键都是独一无二的, 程序可以在字典中根据键查找与之关联的值, 或者通过键来更新值, 又或者根据键来删除整个键值对, 等等。

Redis字典的实现

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

哈希表

typedef struct dictht {
    dictEntry **table; // 哈希表数组
    unsigned long size; // 哈希表大小
    unsigned long sizemask; // 哈希表大小掩码
    unsigned long used; // 该哈希表已有节点的数量
} dictht;

table是一个数组,其中每个元素都是一个指向dictEntry结构的指针。

哈希表节点

typedef struct dictEntry {
    void *key; // 键
    union {
        void *val; 
        uint64_t u64;
        int64_t s64;
        double d;
    } v; // 值
    struct dictEntry *next; // 指向下一个哈希表节点,形成链表,因此是通过链地址法来
} dictEntry;

在这里插入图片描述

我们发现在dictEntry定义中有next指针指向下一个哈希表节点,举个例子:

在这里插入图片描述

字典


typedef struct dict {
    dictType *type; // 类型特定函数
    void *privdata; // 私有数据
    dictht ht[2]; // 哈希表,一般情况下,字典只使用ht[0]哈希表,ht[1]哈希表只会在对ht[0]哈希表进行rehash时进行

    // rehash索引
    long rehashidx; /* rehashing not in progress if rehashidx == -1 */
    int16_t pauserehash; /* If >0 rehashing is paused (<0 indicates coding error) */
} dict;

普通状态下的字典如下图所示:

在这里插入图片描述

Redis哈希算法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐