主题
《面渣逆袭》Redis 篇 · 第 2/8 章。原版 PDF(下载 / 打印)
8.Redis持久化方式有哪些?有什么区别?
Redis 持久化方案分为RDB 和AOF 两种。

RDB
RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB 持久化过程分为手动触发和自动触发。
RDB 文件是一个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。由于RDB 文件是保存在硬盘上的,所以即使Redis 崩溃或者退出,只要RDB 文件存在,就可以用它来恢复还原数据库的状态。
手动触发分别对应save 和bgsave 命令:

save 命令:阻塞当前Redis 服务器,直到RDB 过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。
bgsave 命令:Redis 进程执行fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork 阶段,一般时间很短。
以下场景会自动触发RDB 持久化:
使用save 相关配置,如“savemn”。表示m 秒内数据集存在n 次修改时,自动触发bgsave。
如果从节点执行全量复制操作,主节点自动执行bgsave 生成RDB 文件并发送给从节点执行debugreload 命令重新加载Redis 时,也会自动触发save 操作默认情况下执行shutdown 命令时,如果没有开启AOF 持久化功能则自动执行bgsave。
AOF
AOF (appendonlyfile)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF 文件中的命令达到恢复数据的目的。AOF 的主要作用是解决了数据持久化的实时性,目前已经是Redis 持久化的主流方式。
AOF 的工作流程操作:命令写入 (append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)

流程如下:
所有的写入命令会追加到aof_buf (缓冲区)中。
AOF 缓冲区根据对应的策略向硬盘做同步操作。
随着AOF 文件越来越大,需要定期对AOF 文件进行重写,达到压缩 的目的。
当Redis 服务器重启时,可以加载AOF 文件进行数据恢复。
9.RDB 和 AOF 各自有什么优缺点?
RDB| 优点
只有一个紧凑的二进制文件dump.rdb,非常适合备份、全量复制的场景。
容灾性好,可以把RDB 文件拷贝道远程机器或者文件系统张,用于容灾恢复。
恢复速度快,RDB 恢复数据的速度远远快于AOF 的方式
RDB| 缺点
- 实时性低,RDB 是间隔一段时间进行持久化,没法做到实时持久化/ 秒级持久化。如果在这一间
隔事件发生故障,数据会丢失。
- 存在兼容问题,Redis 演进过程存在多个格式的RDB 版本,存在老版本Redis 无法兼容新版本
RDB 的问题。
AOF| 优点
- 实时性好,aof 持久化可以配置appendfsync属性,有always,每进行一次命令操作就记录
到 aof 文件中一次。
- 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致
性问题。
AOF| 缺点
AOF 文件比 RDB文件大,且恢复速度慢。
数据集大的时候,比 RDB启动效率低。
10.RDB和AOF如何选择?
一般来说,如果想达到足以媲美数据库的数据安全性,应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF文件保存的数据集要比 RDB 文件保存的数据集要完整。
如果可以接受数分钟以内的数据丢失,那么可以只使用 RDB 持久化。
有很多用户都只使用 AOF 持久化,但并不推荐这种方式,因为定时生成 RDB 快照(snapshot)
非常便于进行数据备份,并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,除此之外,使用 RDB 还可以避免 AOF 程序的 bug。
如果只需要数据在服务器运行的时候存在,也可以不使用任何持久化方式。
11.Redis的数据恢复?
当Redis 发生了故障,可以从RDB 或者AOF 中恢复数据。
恢复的过程也很简单,把RDB 或者AOF 文件拷贝到Redis 的数据目录下,如果使用AOF 恢复,配置文件开启AOF,然后启动redis-server 即可。

Redis启动时加载数据的流程:
AOF 持久化开启且存在AOF 文件时,优先加载AOF 文件。
AOF 关闭或者AOF 文件不存在时,加载RDB 文件。
加载AOF/RDB 文件成功后,Redis 启动成功。
AOF/RDB 文件存在错误时,Redis 启动失败并打印错误信息。
12.Redis 4.0 的混合持久化了解吗?
重启 Redis 时,我们很少使用RDB来恢复内存状态,因为会丢失大量数据。我们通常使用 AOF 日志重放,但是重放 AOF 日志性能相对RDB来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。
Redis4.0为了解决这个问题,带来了一个新的持久化选项— —混合持久化。将rdb文件的内容和增量的 AOF 日志文件存在一起。这里的 AOF 日志不再是全量的日志,而是自持久化开始到持久化结
束的这段时间发生的增量 AOF 日志,通常这部分 AOF 日志很小:

于是在 Redis 重启的时候,可以先加载rdb的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重启效率因此大幅得到提升。