重写aof之前
appendonly.aof.1.base.aof
appendonly.aof.1.incr.aof
appendonly.aof.manifest
重写aof 一次
appendonly.aof.2.base.aof 大小变化
appendonly.aof.2.incr.aof 大小o
appendonly.aof.manifest 大小不变AOF文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令
AOF重写触发机制:
①自动触发
通过redis.conf中
auto-aof-rewrite-percentage:100 # 默认100
auto-aof-rewrite-min-size:64mb # 默认redis会记录上次重写aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大于64mb时触发
②手动触发
bgrewriteaof
重写原理
- 在重写开始前,redis会创建一个重写子进程,这个子进程会读取现有的AOF文件,并将其包含的指令进行分析压缩并写入一个临时文件中
- 与此同时,主进程会将新接受到的写指令一边累积到内存缓存区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外
- 当 重写子进程 完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新的AOF文件中
- 当追加结束后,redis就会用新AOF文件来代替旧的AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中
- 重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件。