什么是渐进式rehash

一、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号元素的个数为0,代表rehash完成
此时,就需要把数组1号的指针替换为数组2号,再把数组2号的指针重新置为NULL,最后把rehashidx置为-1。(这样,就完成了redis字典的rehash)

rehash后的操作

  • 接下来因为数组1号是原先的数组2号,所以用新的数组1号对外提供服务

你可能感兴趣的:(什么是渐进式rehash)