什么是渐进式rehash
2020-10-30 本文已影响0人
StevenHD
一、Java中的做法
当新添加元素的时候,元素的总个数超过了阈值的时候,会搞一个2倍大小的数组。

二、Redis中的做法
- redis的字典底层有2个数组
- 还有一个字段rehashidx用来控制rehash(
默认是-1
)
何时发生扩容

什么是扩容

并且rehashidx从
-1
修改为0
此时,当前字典就进入了rehash
的状态
- 之后对字典的
增删改查
操作都会进行一次单步的rehash
三、现在又要进行增加一个元素
- 单步的rehash会从当前的rehashidx开始,把数组1号的元素迁移到数组2号,迁移完一个索引后,rehashidx会
加1
, - 处于
rehash
中的添加操作,都会把新添加的元素直接添加到数组2号中
四、假设接下来又需要查询
- 也会进行同样的单步rehash操作
一直反复直到数组1号元素的
个数为0
,代表rehash完成
此时,就需要把数组1号的指针
替换为数组2号,再把数组2号的指针重新置为NULL
,最后把rehashidx置为-1。(这样,就完成了redis字典的rehash)
rehash后的操作
- 接下来因为数组1号是原先的数组2号,所以用
新的数组1号
对外提供服务