dict总览
image.png
表的结构
- struct dict表示一个字典,数据存在其ht[2]中,ht是两个表
- dictht是表,存了dictEntry数组 **table,每个存放了一个dictEntry的指针
- dictEntry是 一个kv对,还有一个next指针,说明这个表是开链形式
- 一个dict有一个dictType成员,存了一堆函数指针,
普通rehash vs redis dict rehash
普通rehash
- 弄一个新的,更大的table
- 把旧表的所有KV对都copy到新表
- 将旧表清空
redis dict rehash
redis采取incremental rehashing (增量/渐进式rehash)
dictAdd 添加键值对到dict,检查到需要进行rehash时,会将dict.rehashidx 设置为 0 ,标识着 rehash 的开始;
后续请求,在执行add、delete、find操作时,都会判断dict是否正在rehash,如果是,就执行_dictRehashStep()函数,进行增量rehash。
每次执行 _dictRehashStep , 会将ht[0]->table 哈希表第一个不为空的索引上的所有节点就会全部迁移到 ht[1]->table 。
也就是在某次dictAdd 添加键值对时,触发了rehash;后续add、delete、find命令在执行前都会检查,如果dict正在rehash,就先不急去执行自己的命令,先去帮忙搬运一个bucket;
搬运完一个bucket,再执行add、delete、find命令 原有处理逻辑。
渐进式rehash的优点:
避免了一次搬运完时间过长的问题