redis aof 文件重写机制
redis 随着命令不断的写入数据,aof 文件会越来越大。为了解决这个问题,redis 引入了 aof 文件重写机制,以便压缩 aof 体积 ,更小的 aof 文件可以更快的被 redis 加载。
aof 文件重写是将 redis 中的数据转换为 写命令同步更新到 aof 文件的过程。
重写 aof 后 为什么么可以变小
-
清除了一些无效命令 eg. del srem 进程内超时的数据不再写入 aof 文件 多条写命令可以合并为批量写命令 eg. lpush list v1 lpush list v2 lpush list v3 合并为一条写入命令 lpush list v1 v2 v3
aof 重写流程
-
执行 aof 重写请求 如果当前进程正在执行 aof 重写,请求不执行并返回如下响应 ERR Background append only file rewriting already in process 如果当前正在执行 bgsave ,重写命令等待 bgsave 完成后执行 ,返回如下响应 Background append only file rewriting shceduled 父进程执行 fork 创建子进程,开心等同于bgsave过程 父进程 fork 操作完毕之后,依然响应其他命令,所有修改命令依然写入 aof 缓冲区,并根据 appendfsync策略同步到硬盘,保证原有 aof 机制的有效性。 由于 fork 操作采用写时复制技术,子进程只能共享fork 操作时的内存数据,由于父进程依然响应命令,redis 使用 aof 重写缓冲区 保存这部分新数据,防止aof文件生成期间这部分数据的丢失。 子进程根据内存快照,按照命令合并规则写入到新的 aof 文件 新 aof 文件 写入完成之后,子进程通知 父进程,父进程更新统计信息 父进程把 aof 重写缓冲区的数据写入 新的 aof 文件 使用 新 aof 文件替换 旧的 aof 文件
摘自 《redis 开发与运维》一书
