字典就是map,一种保存键值对的抽象数据结构
字典里的每个键都是独一无二的,程序就是通过键来查其对应的值
但C语言也没有内置map,因此redis自己构建的字典
在Redis中,哈希键(Hash key)是一种特殊的键类型,它是一个字符串,其值是一个哈希表。哈希表中可以存储多个键值对
字典就是哈希键的底层实现之一,当一个哈希键包含的键值对比较多,又或者键值对中的元素都是比较长的字符串时,Redis会使用字典作为底层实现哈希键
Redis使用哈希表来实现的字典,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对
typedef struct dictht {
//哈希表数组
dictEntry **table;
//哈希表大小
unsigned long size;
//哈希表大小掩码,用于计算计算索引
unsigned long sizemask;
//哈希表已有节点的数量
unsigned long used;
} dictht;
table为一个数组,里面的每个元素指向dictEntry结构的指针
size记录了哈希表的大小,即数组table的大小
used记录了哈希表已有节点的数量
sizemask = size - 1,这个属性和哈希值一起决定一个键应该被放到数组table哪个索引上面
typedef struct dictEntry {
//键
void *key;
//值
union{
void *val;
uint64_t u64;
int64_t s64;
} v;
//指向下一个节点
struct dictEntry *next;
} dictEntry;
v属性保持着键值对中的值,值可以是一个指针,或者一个uint64_t整数,又或者是一个int64_t整数
next是指向另一个节点的指针,这个指针可以将多个哈希值相同的键值对连接在一次,以此解决键冲突的问题
typedef struct dict {
//类型特定函数
dictType *type;
//私有函数
void *privdata;
//哈希表
dictht ht[2];
//rehash索引
//当rehash不在进行时,值为-1
int rehashidx;
} dict;
typedef struct dictType {
一些操作键的函数
} dictType;
rehash操作并不是一次性,集中做的,而是分多次、渐进式地完成
这样做的原因是,如果含有的键值对太多的话,庞大的计算量会使服务器在一段时间内停止服务
渐进式rehash的步骤: