Redis数据是放在内存中的,如果断电、故障、内存满都会丢失数据。因此,有的时候需要将数据持久化到磁盘中,故障恢复后,将重要的数据重新加载到内存中。一般提供了两种方式:RDBAOF,抑或两者的结合。以下对两种方式进行阐述和对比优缺点。

RDB

基本概念

RDB是Redis Database的简称,是在指定时间间隔对内存中的数据进行的快照存储,默认生成的文件名为:dump.rdb

使用

  1. 使用save命令,同步操作,将数据持久化到硬盘上,注意此过程无法接收其他操作;
  2. 使用bgsave命令,异步操作,fork个子进程持久化。
  3. 服务器自动触发操作,配置文件如下:
    1
    2
    3
    4
    5
    6
    # 900s内至少达到一条写命令
    save 900 1
    # 300s内至少达至10条写命令
    save 300 10
    # 60s内至少达到10000条写命令
    save 60 10000

优点

  1. RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集,并且恢复的速度也很快,非常适合数据备份;
  2. 通过RDB进行数据备,由于使用子进程生成,所以对Redis服务器性能影响较小。

    缺点

  3. 会丢失一部分数据,还没到备份的时间点,出现故障的情况下,就会丢失上一次备份后的数据;
  4. 数据集大的时候,造成资源紧张。

AOF

基本概念

AOF(Append-only file)持久化方式,会记录客户端对服务器的每一次写操作命令,并将这些写操作以Redis协议追加保存到以后缀为aof文件末尾,在Redis服务器重启时,会加载并运行aof文件的命令,以达到恢复数据的目的。

使用

需要配置redis.conf文件:

1
2
3
4
5
6
7
8
9
10
# 开启aof机制
appendonly yes
# aof文件名
appendfilename "appendonly.aof"
# 写入策略,always表示每个写操作都保存到aof文件中,也可以是everysec或no
appendfsync always
# 默认不重写aof文件
no-appendfsync-on-rewrite no
# 保存目录
dir ~/redis/

优点

  1. 你可以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。 AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求)。
  2. AOF 文件是一个只进行追加操作的日志文件(append only log), 因此对 AOF 文件的写入不需要进行 seek , 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题。
  3. Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
  4. AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。

缺点

  1. 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
  2. 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。

注意事项

AOF文件出错了怎么办,正在写aof,服务器宕机,redis重启时就会拒绝载入这个文件,此时的做法是:

  1. 备份当前的aof文件;
  2. 命令进行修复redis-check-aof --fix
  3. 使用diff -u对比修复前后文件的异同;
  4. 重启redis,等待服务器载入AOF文件,并进行数据恢复。

对比

方式 RDB AOF
启动优先级
文件大小
恢复速度
数据安全性 会丢失一部分数据 由策略决定
轻重