redis的hash表如何扩容
随着哈希表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查。