面试题答案
一键面试- 定时快照问题:
- RDB 是定期进行快照操作。在两次快照之间如果发生高并发写入,新写入的数据还未被快照保存,一旦 Redis 发生故障重启,这部分新写入的数据就会丢失,导致数据不一致。例如,设置每 5 分钟进行一次 RDB 快照,在 2 分钟时写入了大量数据,3 分钟时 Redis 崩溃,这 2 分钟内写入的数据在重启后就无法恢复。
- fork 子进程时的阻塞影响:
- RDB 持久化执行时会通过 fork 子进程来进行数据快照。在高并发写入场景下,fork 操作可能会阻塞主线程一小段时间。虽然 Redis 采用写时复制(COW)技术,但 fork 操作本身需要复制内存页表等信息,可能会导致主线程在这短暂时间内无法及时处理新的写入请求,使得部分写入请求响应延迟甚至丢失,影响数据一致性。例如,在高并发写入时,fork 操作导致主线程阻塞 100 毫秒,这期间可能有部分写入请求未被及时处理。
- 子进程写入 RDB 文件时的问题:
- 子进程在将数据写入 RDB 文件过程中,如果磁盘 I/O 出现问题,比如磁盘已满、I/O 性能突然下降等,可能导致 RDB 文件写入不完整。当 Redis 基于这个不完整的 RDB 文件重启时,就会出现数据不一致的情况。例如,磁盘空间在子进程写入 RDB 文件时突然耗尽,导致文件只写入了部分数据,重启后数据缺失。