- rehash分扩容和缩容,两个过程互斥
- 交替使用h0和h1,来回搬迁,类似jvm的s1和s2
- dict结构中的rehashidx默认-1,表示没有在扩容,当rehashidx>=0时,表示处于rehash中,rehashIdx表示当前扩容的桶;
- 每次的增删改查都会检查当前是否需要rehash,如果达到临界点则需要扩容+迁移;如果没有达到临界点,但处于rehash中,则判断帮忙迁移一次;
- 一次迁移一个桶,rehashIdx++,redis后台定时任务会在闲时帮忙一次迁移多个桶;
- 新增时,帮忙后,会直插h1
- 整个rehash过程类似hashMap的rehash过程,只不过map的rehashMap是一次完成的,redis采用渐进式rehash,因为redis的命令是单步执行,不会有并发冲突。hashMap需要防并发;
- concurrentHashMap
- 并行rehash
网友评论