3.dict——redis基础数据结构

dict总览

image.png

表的结构

  • struct dict表示一个字典,数据存在其ht[2]中,ht是两个表
  • dictht是表,存了dictEntry数组 **table,每个存放了一个dictEntry的指针
  • dictEntry是 一个kv对,还有一个next指针,说明这个表是开链形式
  • 一个dict有一个dictType成员,存了一堆函数指针,

普通rehash vs redis dict rehash

普通rehash

  1. 弄一个新的,更大的table
  2. 把旧表的所有KV对都copy到新表
  3. 将旧表清空

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的优点:

避免了一次搬运完时间过长的问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容