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 设计与实现》