主题
《面渣逆袭》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 )、重启加载(l oad )

流程如下:
所有的写入命令会追加到a of_buf (缓冲区)中。
AOF 缓冲区根据对应的策略向硬盘做同步操作。
随着AOF 文件越来越大,需要定期对AOF 文件进行重写,达到压缩 的目的。
当Redis 服务器重启时,可以加载AOF 文件进行数据恢复。
9.RDB 和 AOF 各自有什么优缺点?
RDB| 优点
只有一个紧凑的二进制文件dump.rdb,非常适合备份、全量复制的场景。
容灾性好,可以把RDB 文件拷贝道远程机器或者文件系统张,用于容灾恢复。
恢复速度快,RDB 恢复数据的速度远远快于AOF 的方式
RDB| 缺点
- 实时性低,RDB 是间隔一段时间进行持久化,没法做到实时持久化/ 秒级持久化。如果在这一间
隔事件发生故障,数据会丢失。
- 存在兼容问题,Redis 演进过程存在多个格式的RDB 版本,存在老版本Redis 无法兼容新版本
RDB 的问题。
AOF| 优点
- 实时性好,a of 持久化可以配置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 全量文件重放,重启效率因此大幅得到提升。