AOF 重写

AOF 持久化是通过保存写命令来记录数据变化的,随着时间的流逝 AOF 文件会越来越大,Redis 提供了 AOF 重写功能来解决 AOF 文件体积膨胀问题:创建一个新的 AOF 文件来替代现有的 AOF 文件,新的 AOF 文件不会包含任何浪费空间的冗余命令,体积大小相比旧的 AOF 文件小很多

实现原理

重写步骤

数据库中读取键当前的值,然后用一条命令去记录键值对,代替之前记录该键值对的多个命令

  1. 遍历所有键
  2. 如果键带有过期时间,并且已经过期,则跳过
  3. 用 SET key value 命令来保存字符串键
  4. 用 RPUSH key item1 item2 ... itemN 命令来保存列表键
  5. 用 SADD key member1 member2 ... memberN 命令来保存集合键
  6. 用 HMSET key field1 value1 field2 value2 ... fieldN valueN 命令来保存哈希键
  7. 用 ZADD key score1 member1 score2 member2 ... scoreN memberN 命令来保存有序集键
  8. 如果 key 带有过期时间,则用 EXPIREAT key time 命令来保存键的过期时间

后台重写

出现的问题

子进程在进行 AOF 重写期间,服务器进程还要继续处理命令请求,而新的命令可能对现有的数据进行修改,这会让当前数据库的数据和重写后的 AOF 文件中的数据不一致

解决

效果

完成重写后

触发重写

AOF 重写可以由用户手动触发,也可以由服务器自动触发

手动

通过调用BGREWRITEAOF手动触发

自动

服务器在 AOF 功能开启的情况下,会维持以下三个变量:

每当服务器周期性操作函数serverCron函数执行时,它会检查以下条件是否全部满足,如果全部满足的话,就触发自动的 AOF 重写操作:

资料

《Redis 设计与实现》