面试题答案
一键面试渐进式rehash实现方式
- 双哈希表:Redis 为每个字典维护两个哈希表,分别为
ht[0]
和ht[1]
。正常情况下,所有数据存储在ht[0]
中。 - 初始化
ht[1]
:当需要进行 rehash 时,会给ht[1]
分配空间,其大小一般是ht[0]
的两倍(或根据具体策略)。 - 渐进式迁移:在 rehash 期间,Redis 并不会一次性将
ht[0]
中的所有键值对迁移到ht[1]
中。而是在每次对字典进行插入、删除、查找或者更新操作时,顺带从ht[0]
中迁移一部分键值对到ht[1]
中。每次迁移的数量通常是1个或少量几个。 - 更新索引:随着迁移的进行,会更新相关的索引,使得对字典的操作逐渐开始从
ht[1]
中查找数据。当ht[0]
中的所有键值对都迁移到ht[1]
后,释放ht[0]
,将ht[1]
重命名为ht[0]
,并为下一次 rehash 准备新的ht[1]
。
渐进式rehash的好处
- 避免阻塞:如果一次性进行 rehash,在数据量较大时,会消耗大量的 CPU 时间,导致 Redis 服务在这段时间内无法处理其他客户端请求,造成服务阻塞。渐进式 rehash 则将 rehash 操作分散到多次操作中,避免了这种长时间的阻塞,保证了 Redis 服务的高可用性和响应及时性。
- 平衡负载:渐进式 rehash 使 CPU 负载更为平滑,不会在某一时刻出现 CPU 使用率过高的情况,系统可以在进行 rehash 的同时,正常处理客户端的其他请求,提高了系统整体的性能和稳定性。