字典简介
- 字典,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构
- 字典中的每个键都是独一无二的
- 字典在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]在重哈希时用