redis dict结构体包含两个hash表,ht[0]、ht[1],其中ht[0]指向优先被使用的hash表,ht[1]指向扩容用的hash表,rehash使用dict结构体中的rehashidx属性辅助完成,rehashidx属性指向哪个slot,每次就将ht[0]的那个slot的元素移动到ht[1]中,然后自增rehashidx,直到遍历完整个hash表。由于不是一次性完成rehash,rehash进行时可能穿插着查找等操作,查找的过程是先从ht[0]中查找,若查找不到,则在ht[1]中查找元素。
redis的 rehash包括了lazy rehashing和active rehashing两种方式
lazy rehashing:在每次对dict进行操作的时候执行一个slot的rehash
active rehashing:每100ms里面使用1ms时间进行rehash。这种方式在redis的事件循环,servercron中有相应体现。