Redis 持久化

Redis 持久化主要有两种方式,RDB 和 AOF

RDB(Redis DataBase)

RDB 持久化是把当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。

RDB 有手动触发自动触发两种触发方式。

手动触发:

  • save命令:阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用;
  • bgsave命令:Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。

自动触发:

  • redis.conf中配置save m n,即每 m 秒内有 n 次修改时,自动触发 bgsave 生成 rdb 文件;
  • 主从复制时,从节点要从主节点进行全量复制时也会触发 bgsave 操作,生成当时的快照发送到从节点;
  • 执行 debug reload 命令重新加载 redis 时也会触发 bgsave 操作;
  • 默认情况下执行 shutdown 命令时,如果没有开启 aof 持久化,那么也会触发 bgsave 操作。

使用 RDB 模式的优点:

  • RDB 文件是某个时间节点的快照,默认使用 LZF 算法进行压缩,压缩后的文件体积远远小于内存大小,适用于备份、全量复制等场景;
  • Redis 加载 RDB 文件恢复数据要远远快于 AOF 方式;

使用 RDB 模式的缺点:

  • RDB 方式实时性不够,无法做到秒级的持久化;
  • 每次调用 bgsave 都需要 fork 子进程,fork 子进程属于重量级操作,频繁执行成本较高;
  • RDB 文件是二进制的,没有可读性,AOF 文件在了解其结构的情况下可以手动修改或者补全;
  • 版本兼容 RDB 文件问题。

AOF(Append-Only File)

AOF 采用写后日志,即先写内存,后写日志。AOF 写回策略共有三种,默认的配置项为 Everysec:

AOF 重写过程是由后台进程 bgrewriteaof 来完成的。主线程 fork 出后台的 bgrewriteaof 子进程,fork 会把主线程的内存拷贝一份给 bgrewriteaof 子进程,这里面就包含了数据库的最新数据。然后,bgrewriteaof 子进程就可以在不影响主线程的情况下,逐一把拷贝的数据写成操作,记入重写日志。

使用 AOF 模式的优点:

  • 实时性强,发生故障丢失数据少。

使用 AOF 模式的缺点:

  • 日志文件体积大
  • 恢复速度慢