《Redis 设计与实现》第二版读书笔记之字典

字典简介

  • 字典,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构
  • 字典中的每个键都是独一无二的
  • 字典在Redis中的应用相当广泛,比如Redis的数据库就是使用字典来作为底层实现的,对数据库的增删查改操作也是构建在对字典的操作之上的
  • 除了用来表示数据库之外,字典还是哈希键的底层实现之一

Redis中字典的实现

哈希表

dict.h/dictht:

typedef struct dictht {
    // 哈希表数组
    dictEntry **table;
    // 哈希表大小
    unsigned long size;

    // 哈希表大小掩码,用于计算索引值
    // 总是等于size-1
    unsigned long sizemask;

    // 该哈希表已有节点的数量
    unsigned long used;
} dictht;

table属性是一个数组,数组中的每个元素都是一个指向dict.h/dictEntry结构的指针,每个dictEntry结构保存这一个键值对

哈希表节点

typedef struct dictEntry {
    // 健
    void *key;;
    // 值
    union{
        void *val;
        uint64_tu64;
        int64_ts64;
    } v;

    // 指向下一个哈希表节点,形成链表,解决键冲突的问题
    struct dictEntry *next;
} dictEntry;

 字典

dict.h/dict

typedef struct dict{
    // 类型特定函数
    dictType *type;

    // 私有数据
    void *privdata;

    // 哈希表
    dictht ht[2];

    // rehash索引
    // 当rehash不进行时,值为-1
    int trehashidx;
} dict;

type属性和privdata属性针对不同类型的键值对,为创建多态字典而设置的
+ type属性是一个指向dictType结构的指针,每个dictType结构保存了一簇用与操作特定类型键值对的函数
+ privdata属性则保存了需要传给那些类型特定函数的可选参数
+ ht属性是一个包含两个项的数组,数组中的每个项都是一个dictht哈希表,一般情况下,字典只用ht[0]哈希表,ht[1]在重哈希时用

猜你喜欢

转载自blog.csdn.net/westbrookliu/article/details/82261439