面试题答案
一键面试触发条件
- 自动触发:
- 由
auto - aof - rewrite - percentage
和auto - aof - rewrite - min - size
两个配置参数控制。 - 当
AOF
文件大小超过auto - aof - rewrite - min - size
(默认64MB),并且AOF
文件大小相比于上一次重写后大小的增长率超过auto - aof - rewrite - percentage
(默认100%)时,会自动触发AOF
重写。
- 由
- 手动触发:
- 执行
BGREWRITEAOF
命令,Redis 会在后台进行AOF
重写。
- 执行
重写过程
- 创建子进程:Redis 主进程调用
fork
函数创建一个子进程,这个子进程会共享主进程的内存数据。 - 子进程重写:
- 子进程根据当前内存中的数据生成一份精简的
AOF
重写日志,这份日志记录了重建当前数据状态所需的最小命令集。 - 例如,如果在
AOF
文件中有多条对同一个键的操作命令,子进程在重写时可能只记录最终的结果命令。
- 子进程根据当前内存中的数据生成一份精简的
- 主进程处理新写操作:在子进程重写期间,主进程依然可以正常处理客户端的写请求。对于新的写操作,主进程除了将其写入现有的
AOF
文件外,还会将这些操作记录到一个内存缓冲区(aof_rewrite_buf
)中。 - 子进程完成重写:子进程完成
AOF
重写日志的生成后,会向主进程发送一个信号。 - 主进程切换:主进程收到子进程的信号后,会将内存缓冲区中的新写操作追加到子进程生成的重写日志的末尾,以保证数据的一致性。然后主进程会原子性地用新的重写后的
AOF
文件替换旧的AOF
文件,并开始使用新的AOF
文件进行后续的写操作。
保证数据一致性和性能的措施
- 保证数据一致性:
- 双写机制:主进程在子进程重写
AOF
期间,对新的写操作采用双写策略,既写入当前AOF
文件,又写入内存缓冲区。在子进程完成重写后,主进程将缓冲区中的操作追加到重写后的AOF
文件末尾,确保重写前后数据的一致性。 - 原子替换:主进程在使用新的重写后的
AOF
文件替换旧文件时,采用原子操作,避免在替换过程中出现数据丢失或不完整的情况。
- 双写机制:主进程在子进程重写
- 保证性能不受太大影响:
- 使用子进程:通过
fork
创建子进程进行重写,子进程共享主进程的内存数据,避免了对主进程正常处理业务的阻塞。主进程可以继续处理客户端请求,只有在fork
操作和最后替换AOF
文件时会有短暂的性能开销。 - 优化重写算法:子进程在重写
AOF
日志时,采用优化的算法,只记录重建数据状态所需的最小命令集,减少了重写后的AOF
文件大小,从而减少了写磁盘的 I/O 操作和重写所需的时间。 - 缓冲区控制:主进程使用内存缓冲区记录新的写操作,避免在子进程重写期间频繁写入磁盘,减少 I/O 争用,保证主进程处理客户端请求的性能。
- 使用子进程:通过