一、Java中的做法
当新添加元素的时候,元素的总个数超过了阈值的时候,会搞一个2倍大小的数组。
阻塞态
二、Redis中的做法
- redis的字典底层有2个数组
- 还有一个字段rehashidx用来控制rehash(
默认是-1
)
何时发生扩容
元素的个数和数组长度一致的时候什么是扩容
扩容就是把数组2号初始化一个2倍的数组并且rehashidx从
-1
修改为0
此时,当前字典就进入了rehash
的状态
- 之后对字典的
增删改查
操作都会进行一次单步的rehash
三、现在又要进行增加一个元素
- 单步的rehash会从当前的rehashidx开始,把数组1号的元素迁移到数组2号,迁移完一个索引后,rehashidx会
加1
, - 处于
rehash
中的添加操作,都会把新添加的元素直接添加到数组2号中
四、假设接下来又需要查询
- 也会进行同样的单步rehash操作
一直反复直到数组1号元素的
rehash后的操作个数为0
,代表rehash完成
此时,就需要把数组1号的指针
替换为数组2号,再把数组2号的指针重新置为NULL
,最后把rehashidx置为-1。(这样,就完成了redis字典的rehash)
- 接下来因为数组1号是原先的数组2号,所以用
新的数组1号
对外提供服务
网友评论