1. 持久化概念

所谓持久化是指将数据从内存中以某种形式同步到硬盘中,在 redis 重启后能够根据硬盘中的记录恢复数据。Redis 持久化有两种方式,分别为 RDB 【快照】方式 和 AOF 【日志】方式。

1. RDB 【快照】方式

RDB 持久化是 Redis 的默认支持,无需进行配置。RDB 是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
当符合一定规则时,Redis 自动将内存中的所有数据生成一份副本并存储到硬盘上。分为以下四种情况:

  1. 根据配置规则自动进行快照
SAVE  900 1 
SAVE  300 10
SAVE  60  1000

SAVE 900 1 表示 900s 内有一个或一个以上的键被更改则进行快照配置文件中

  1. 用户执行 SAVE 或 BGSAVE 命令
    (1) SAVE 命令
    Redis 会同步的进行快照操作,在快照执行过程中会阻塞所有来自客户端请求。
    (2) BGSAVE 命令
    Redis 会在后台异步地进行快照操作,在快照执行过程服务端可以继续响应来自客户端的请求.
    具体操作是 Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。建议使用。
  2. 执行 FLUSHALL 命令
    只要快照配置条件不为空,执行该命令时就会执行一次快照操作;而当没有定义快照条件时,即使执行该命令也不会执行快照操作
  3. 执行复制 replication
    即使没有定义自动快照条件,且没有手动执行过快照操作,进行复制操作时也会进行自动快照

2. AOF 【日志】方式

该机制将以日志的形式记录服务器所处理的每一个写操作,在 Redis 服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。

  1. 默认关闭,通过 appendonly yes 可开启
  2. 开启后,每执行一条更改数据库中的命令时,Redis 都会将该命令写入硬盘的 AOF 文件
  3. 达到一定条件时,Redis 会自动重写 AOF 文件
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
  1. 启动时 Redis 会逐个执行 AOF 文件中的命令将硬盘中的数据载入到内存中
  2. appendfsync everysec 通过配置文件中的该配置项,可使硬盘缓存中的数据每 1s 同步一次到真正的硬盘中

事实上由于操作系统缓存机制,数据并没有真正写入硬盘,而是进入系统硬盘缓存。

两者区别:
RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是 fork 一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

AOF 持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

3. RDB 数据恢复

RDB 方式的持久化的数据恢复不需太多操作,只要将备份文件放入 Redis 的安装目录,启动即可。Redis 会自动加载文件至内存。在加载过程中会一直处于阻塞状态。

3.1 优势:

  • 整个数据库只包含一个备份文件。容易恢复和存储。
  • 方便复制和转移。
  • 相比于 AOF,数据集很大的情况下,RDB 的启动效率更高。
  • 性能最大化。对于 Redis 的服务进程而言,在开始持久化时,它唯一需要做的只是 fork 出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行操作。

3.2 劣势:

  • 如果想最大限度避免数据丢失,RDB 不是一个好选择,如果系统在持久化期间出现宕机,没有写入磁盘的数据都会丢失。
  • RDB 通过 fork 子进程来协助完成持久化,如果数据集较大,会导致服务器停止一些时间。

4. AOF 数据恢复

与 RDB 一样,重启 Redis,Redis 会自动加载 AOF 文件,实现数据恢复。

4.1 优势

  • AOF 的数据安全性和同步性比 RDB 形式高。默认为每秒同步一次,如果设置为每操作同步一次,则数据会实现完全同步。
  • AOF 文件是通过追加的形式生成的。如果最后一次写入出现异常也不会影响之前的文件数据。
  • AOF 文件具有清晰可读的文件格式,如果我们错误的写入了命令,可以立马关闭,在重写没进行时,先进入文件中,去掉写错的命令。

4.2 劣势

  • AOF 占用的空间比 RDB 大。
  • AOF 的同步速度比 RDB 慢。

5. 总结如何选择

如果对数据的完整性要求不是极高,可以丢失一点数据,那选择 RDB 是最好的。RDB 无论是备份方便性和恢复速度都高于 AOF,同时可以避免 AOF 的一些bug。

如果对数据的完整性要求极高,请选择 AOF 形式。

redis数据怎么恢复 redis数据恢复模式_redis数据怎么恢复