Redis的渐进式rehash是指在进行字典扩容(rehash)时,Redis将扩容操作分批进行,以避免一次性耗费大量CPU时间导致请求被阻塞。
在Redis中,当字典的负载因子(load factor)超过一定阈值时,会触发字典的扩容操作,即将现有的哈希表数组进行扩容,以减少哈希冲突,提高字典的性能。
渐进式rehash的过程如下:
1. Redis创建一个新的空哈希表(新哈希表)作为扩容时的目标哈希表。
2. Redis每次从旧哈希表中取出一部分键值对,并将其重新计算哈希值,然后插入到新哈希表中。这一步是逐步迁移键值对的过程。
3. 在渐进式rehash的过程中,Redis维护一个索引器(index)来记录当前扩容的进度。
4. Redis在每次执行指令时,会先从旧哈希表查找键值对,如果找不到,则从新哈希表中查找。这样,即使哈希表正在扩容,业务仍然可以继续进行,避免了请求的阻塞。
5. 当所有键值对都从旧哈希表迁移到新哈希表后,Redis会将新哈希表替换旧哈希表,完成扩容过程。此时,索引器指向新的哈希表。
通过渐进式rehash,Redis能够平滑地将大量键值对从旧哈希表迁移到新哈希表,减少一次性扩容带来的阻塞风险,保证服务的稳定性和可用性。