随着哈希表 1 的数据增多,会触发 rehash,创建哈希表 2,一般比哈希表 1 大两倍,然后逐渐把哈希表 1 的数据迁移到哈希表 2,迁移完成后哈希表 1 的空间被释放,然后把哈希表 2 命名为哈希表 1。
然而在数据迁移时,**如果采用一次性迁移可能会因数据量过大出现抖动,影响性能,所以 redis 采用了渐进式 rehash,即迁移工作分多次完成。**过程如下:
- 给「哈希表 2」分配空间;
- 在 rehash 进行期间,每次哈希表进行增删改查时,Redis 除了会执行对应的操作之外,还会顺序将「哈希表 1」中索引位置上的所有 key-value 迁移到「哈希表 2」上;
- 随着处理客户端发起的哈希表操作请求数量越多,最终在某个时间点会把「哈希表 1」的所有 key-value 迁移到「哈希表 2」,从而完成 rehash 操作。
扩容期间如果有读请求,会先在表 1 查,查不到再去表 2 查。