如下图为普通状态下字典的结构
dicth.h/dict结构如下
typedef struct dict{
dictType *type;//类型特定函数
void *privtata;//私有数据
dictht ht[2];//哈希表
int trehashidx;//rehash标志
}
dicth.dictht结构如下
typedef struct dictht{
dictEntry **table;//哈希表数组
unsigned long size;//哈希表大小
unsigned long sizemask;//哈希表大小掩码,=size-1
unsigned long used;//已有节点数量
}
dictEntry结构如下
typedef struct dictEntry{
void *key;//键
union{
void *val;
uint64_tu64;
int64_ts64;
}v;
struct dictEntry *next;//指向下一节点的指针
}dictEntry;
Redis字典结构使用链地址法解决键冲突,若两节点键的hash值相等,着形成一个单向链表;
字典渐进式rehash
1.为ht[1]分配空间
2.rehashidx = 0
3.rehash期间,对字典执行增删改查操作时,除会执行指定操作外,还会把ht[0]上rehashidx索引的所有键值对rehash到ht[1]。完成后 rehashidx++。(增删改查操作会先在ht[1]上进行查找,若未找到则再到ht[0]上查找)
4.当ht[0]中所有键值对被rehash至ht[1]时,rehashidx = -1,且ht[0]与ht[1]互换