Redis 是在内存中储存数据的,当服务器重启时,所有的数据都将会丢失。为了保证数据的安全,Redis 提供了将数据持久化到磁盘中的机制。Redis 共有两种数据持久化模型:RDBAOF

RDB

RBF 方式的持久化是通过快照完成的,当符合一定条件时 Redis 会自动将内存中的所有数据生成一份副本保存在硬盘上,这个过程即为“快照”。Redis 会在以下几种情况下对数据进行快照。

  • 根据配置规则进行自动快照。
  • 用户执行 SAVEBGSAVE 命令
  • 执行 FLUSHALL 命令。
  • 执行复制时。

根据配置规则进行自动快照。

Redis 允许用户自定义快照条件,当符合快照条件时,Redis 会自动自行快照操作。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间窗口 M 和改动的键的个数 N。每当时间 M 内被更改的键的个数大于 N 时,即符合自动快照条件。

save 900 1 # 在 15 分钟内有一个或一个以上的键被更改则进行快照
save 300 10
save 60 10000

SAVEBGSAVE

  1. SAVE 命令
    在执行 SAVE 命令时,Redis 同步地进行快照操作,在快照执行的过程中会阻塞所有来自客户端的请求。当数据库中的数据比较多时,这一过程会导致 Redis 较长时间不响应。
  2. BGSAVE 命令
    需要手动执行快照时推荐使用 BGSAVE 命令。BGSAVE 命令可以在后台异步地进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。

执行 FLUSHALL 命令

当执行 FLUSHALL 命令时,Redis 会清除数据库中的所有数据。当没有定义自动快照条件时,执行 FLUSHALL 则不会进行快照。

执行复制时

当设置了主从模式时,Redis 会在复制初始化时进行自动快照。

快照原理

Redis 默认会将快照文件储存在 Redis 当前进程的工作目录中的 dump,rdb 文件中,可以通过配置 dirdbfilename 两个参数分别指定快照文件的储存路径和文件名。快照的过程如下:

  1. Redis 使用 fork 函数复制一份当前进程(父进程)的副本(子进程)
  2. 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。
  3. 当子进程写入完所有数据后会用该临时文件替换旧的 RDB 文件,至此一次快照操作完成。

AOF

当使用 Redis 储存非临时数据时,一般需要打开 AOF 持久化来降低进程中止导致的数据丢失。AOF 可以将 Redis 执行的每一条写命令追加到硬盘文件中,这一过程虽然会降低 Redis 的性能,但是大部分情况下这个影响是可以接受的。

开启AOF

默认情况下 Redis 没有开启 AOF 方式的持久化,可以通过 appendonly 参数启用。

appendonly yes