Redis 持久化方式支持 RDB 和 AOF。

RDB 持久化

RDB 持久化就是通过执行 BGSAVE 命令,根据当前数据库的状态生成一个 RDB 文件,每一个 RDB 文件都包含了当前 Redis 服务器执行命令时所有的数据,所以 RDB 持久化属于全量持久化。

BGSAVE 命令的执行时机是可配置的:

  1. save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令。
  2. save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令。
  3. save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令。

BGSAVE 命令是后台 fork 子进程来执行的,不会影响服务器的数据交互。

RDB 持久化虽然包含了某个时间的全量数据,但实时性不强。

恢复数据时,需要载入 RDB 文件,重新恢复某一时间的 Redis 状态。

AOF 持久化

开启 AOF 持久化,当 Redis 服务器每执行一个修改操作,都会将该操作命令追加到 AOF 文件中。该过程共分为三个步骤:

  1. 追加到 AOF 缓冲区;
  2. 将缓冲区的数据写入到 AOF 文件;
  3. 同步 AOF 文件;(同步相当于保存)

同步 AOF 的时机是可以配置的:

appendfsync always    #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
appendfsync everysec  #每秒钟同步一次,显示地将多个写命令同步到硬盘
appendfsync no        #让操作系统决定何时进行同步

为了兼容性能和安全性,可以选择每秒钟同步一次,这时在系统崩溃需要恢复时,最多丢失一秒以内的数据。

AOF 重写

AOF 重写基于 BGREWRITEAOF 命令,该操作的过程是根据当前数据库的状态,重新生成一个 AOF 文件,替换原来的 AOF 文件,达到缩小文件体积的目的。

在执行 BGREWRITEAOF 命令时,Redis 服务器会维护一个 AOF 重写缓冲区,由于重写生成新的 AOF 文件时,是 fork 子进程后台运行的,这个时间内 Redis 服务器接收的写入命令都会保存在 AOF 重写缓冲区内,当新的 AOF 文件生成后,再将缓冲区的内容追加到 AOF 文件中,保证 AOF 重写前后数据库状态的一致性。最后再讲新生成的 AOF 文件替换原来的文件,至此 AOF 重写就完成了。