RDB vs AOF
Redis 的数据保存在内存中,为保证数据不会因为宕机等故障而全部丢失,Redis 提供了持久化机制
Redis 提供了两种持久化机制:
- RDB(Redis DataBase)
- AOF(Append-Only File)
RDB
RDB 持久化是将某个时间点的 Redis 数据保存到一个 RDB 文件中,该文件是一个经过压缩的二进制文件,通过该文件可以还原生成 RDB 文件时 Redis 中的数据,Redis 提供了 2 个命令来创建 RDB 文件:
- SAVE
- BGSAVE
BGSAVE 命令仅在 fork 进程的时候阻塞,生成数据文件时不阻塞,推荐使用
载入 RDB 文件
Redis 载入 RDB 文件并没有专门的命令,是在 Redis 服务器启动时自动执行的,但 Redis 是否会载入 RDB 文件还取决于 Redis 是否开启了 AOF 持久化功能,具体逻辑为:
- 如果服务器开启了 AOF 持久化功能,服务器优先使用 AOF 文件来还原数据
- 如果服务器未开启 AOF 持久化功能,服务器才会使用 RDB 文件来还原数据
AOF
AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据的,默认情况下 AOF 持久化功能是关闭的,需要修改配置进行开启
载入 AOF 文件
因为 AOF 文件中包含了重建数据所需的所有写命令,所以 Redis 服务器只要读入并重新执行一遍 AOF 文件里面保存的写命令,就可还原 Redis 服务器之前的数据
Redis 读取 AOF 文件并还原数据的步骤为:
- Redis 命令只能在客户端的上下文中执行,所以先创建一个不带网络的伪客户端
- 从 AOF 文件中分析并读取出一条写命令
- 使用伪客户端执行读取出的写命令
- 循环执行步骤 2 和 3,直到 AOF 中所有命令都执行完
两者区别
| - | RDB | AOF |
|---|---|---|
| 实现方式 | 存储某个时间点 Redis 中的全部数据到 RDB 文件 | 记录 Redis 执行的所有写命令到 AOF 文件 |
| 文件体积 | RDB 记录的是结果,体积小 | AOF 记录的是过程,体积大 Redis 提供了重写功能来解决文件体积过大的问题 |
| 安全性 | 低,会丢失上次 RDB 持久化后写入的数据 | 高,最多丢失 1s 内写入的数据 |
| 优先级 | AOF 未开启时执行 | 优先执行 |
两者优缺点
RDB
优点:
-
只有一个文件 dump.rdb,方便持久化
-
容灾性好,一个文件可以保存到安全的磁盘
-
性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 Redis 的高性能
-
相对于数据集大时,比 AOF 的启动效率更高
缺点:
- 数据安全性低,RDB 是间隔一段时间进行持久化,如果持久化之间 Redis 发生故障,会发生数据丢失
AOF
优点:
- 数据安全,AOF 持久化可以配置 appendfsync 属性,always 方式可每进行一次命令操作就记录到 AOF 文件中一次
- 通过 append 模式写文件,即使中途服务器宕机,可以通过 redischeck-aof 工具解决数据一致性问题
- AOF 文件没被 rewrite 之前(文件过大时会对文件进行合并重写),可以删除其中的某些误操作命令(比如 flushall 等)
缺点:
- AOF 文件比 RDB 文件大,且恢复速度慢
- 数据集大的时候,比 RDB 启动效率低