面试题答案
一键面试潜在问题
- CPU 使用率问题:
- 渐进式 rehash 虽然避免了一次性 rehash 带来的大量计算,但在高并发写入时,每次写入操作都可能触发 rehash 步骤,这会使 CPU 在处理业务逻辑和 rehash 之间频繁切换。由于 rehash 本身需要计算新的哈希位置等操作,会占用一定的 CPU 资源,导致 CPU 使用率升高。
- 内存使用问题:
- 在渐进式 rehash 过程中,新旧两个哈希表会同时存在,直到 rehash 完成。在高并发写入场景下,写入的数据量不断增加,新旧哈希表同时占用内存,可能导致内存使用量大幅上升,甚至可能超出系统内存限制,引发内存不足错误。
- 数据迁移延迟:
- 高并发写入意味着大量数据不断涌入。而渐进式 rehash 每次只迁移少量数据,这可能导致数据迁移速度跟不上数据写入速度。新数据持续写入旧哈希表,旧哈希表中的数据不能及时迁移到新哈希表,使得 rehash 过程被拉长。
对系统性能的影响
- 响应时间变长:由于 CPU 使用率升高以及数据迁移延迟,处理写入请求时,除了正常的写入操作外,还需要花费额外时间进行 rehash 相关操作,这会导致 Redis 处理单个请求的时间增加,整体系统的响应时间变长,降低了系统的吞吐量。
- 性能抖动:每次写入可能触发不同程度的 rehash 操作,这使得系统的性能出现抖动。在高并发场景下,这种抖动会更加明显,影响业务系统对 Redis 性能的稳定预期。
对数据一致性的影响
- 数据分布不均匀:如果 rehash 过程中数据迁移延迟,可能导致新旧哈希表中的数据分布不均匀。新写入的数据集中在旧哈希表,而旧哈希表的数据不能及时迁移到新哈希表,在读取数据时,可能会出现部分数据在旧表,部分在新表的情况,影响数据一致性,特别是在需要保证数据原子性读取的场景下。
- 并发读写问题:在高并发写入和渐进式 rehash 同时进行时,由于读写操作可能涉及新旧两个哈希表,可能会出现读操作读到部分旧表数据和部分新表数据的情况,导致数据一致性问题。例如,在进行某个涉及多个键值对的事务操作时,可能因为 rehash 导致部分键值对在旧表,部分在新表,使得事务操作无法保证原子性,破坏数据一致性。