面试题答案
一键面试1. AOF文件重写机制
- 背景:AOF文件在运行过程中会不断增大,为了避免文件过大带来的性能问题,Redis提供了AOF重写机制。
- 操作:
- 手动重写:可以使用
BGREWRITEAOF
命令,Redis会在后台进行AOF重写。它会创建一个新的AOF文件,这个过程不会对当前正在使用的AOF文件产生影响。 - 自动重写:通过配置
auto - aof - rewrite - min - size
(触发AOF重写的最小文件大小)和auto - aof - rewrite - percentage
(当前AOF文件大小较上次重写后增长的百分比)来实现自动重写。当AOF文件大小达到auto - aof - rewrite - min - size
且较上次重写后增长的百分比超过auto - aof - rewrite - percentage
时,Redis会自动触发BGREWRITEAOF操作。
- 手动重写:可以使用
- 流程:
- 父进程调用
fork
创建子进程,这个子进程是父进程的一个副本,共享内存等资源。 - 子进程遍历当前数据库状态,将每个键值对转换为Redis命令写入到新的AOF文件中。这个过程会优化命令,比如将多次对同一个键的修改合并为一条最终的命令。
- 父进程继续处理客户端请求,在子进程重写期间,父进程会将新的写命令缓存到一个缓冲区中。
- 子进程完成重写后,向父进程发送信号,父进程收到信号后,将缓存的写命令追加到新的AOF文件中,然后用新的AOF文件替换旧的AOF文件。
- 父进程调用
2. AOF文件修复机制
- 背景:系统崩溃等异常情况可能导致AOF文件损坏,使得Redis重启时无法正常加载。
- 操作:使用
redis - check - aof
工具来修复损坏的AOF文件。 - 流程:
redis - check - aof
工具会逐行读取AOF文件。- 对于读取到的每一条命令,它会检查命令的语法是否正确。如果命令语法正确,就将其保存到一个临时文件中;如果命令语法错误,工具会尝试跳过该命令(具体处理方式取决于工具的实现逻辑),继续读取下一条命令。
- 处理完整个AOF文件后,临时文件中的内容就是修复后的AOF文件内容,将临时文件重命名为原AOF文件名,即可用于Redis重启恢复数据。
3. 重启加载AOF文件流程
- 背景:Redis重启时需要加载AOF文件来恢复数据,确保数据一致性。
- 操作:Redis启动时,会检查是否开启了AOF持久化以及AOF文件是否存在。
- 流程:
- 如果AOF文件存在且没有损坏,Redis会按照AOF文件中的命令顺序逐一执行,重建数据库状态。因为AOF文件记录了从数据库初始化以来的所有写操作,通过重放这些操作,就能恢复到崩溃前的状态。
- 如果AOF文件存在但损坏,先使用
redis - check - aof
工具进行修复,修复完成后再加载修复后的AOF文件来恢复数据。 - 如果AOF文件不存在,Redis则以空数据库状态启动。