1. RDB(Redis Database)
-
机制:
RDB 是 Redis 默认的持久化方式,它将某个时间点的内存数据快照保存到磁盘文件(默认名为dump.rdb
)。可以通过手动执行SAVE
或BGSAVE
命令触发,也可以配置自动快照(如每 5 分钟有 1000 个键变更时)。 -
优点:
- 文件紧凑,适合备份、灾难恢复或跨环境迁移。
- 恢复速度快,适合大规模数据恢复。
- 对 Redis 性能影响较小(通过
BGSAVE
在后台 fork 子进程完成)。
-
缺点:
- 数据安全性较低,若 Redis 崩溃,可能丢失最后一次快照后的所有数据。
- 频繁执行
BGSAVE
可能导致 fork 操作消耗大量内存和 CPU 资源。
2. AOF(Append-Only File)
-
AOF 以日志形式记录 Redis 执行的所有写操作命令(如
SET
、INCR
、HSET
等),而非数据本身。当 Redis 重启时,会按顺序重新执行这些命令来恢复数据状态。 -
AOF记录的是命令操作日志,RDB快照记录的是某个瞬间的内存数据
-
关键流程
- 命令执行:客户端发送写命令到 Redis 服务器。
- 命令追加:Redis 将执行后的命令追加到 AOF 缓冲区(内存)。
- 文件同步:根据配置的同步策略,将缓冲区内容写入磁盘 AOF 文件。
- 文件重写(可选):定期压缩 AOF 文件,去除冗余命令
-
同步策略(
appendfsync
)控制 AOF 缓冲区写入磁盘的频率,影响数据安全性和性能:
always
:每次写操作后同步到磁盘(最安全,最多丢失一个命令)。
优点:数据安全性最高;缺点:性能最差(每次写都触发磁盘 IO)。everysec
(默认):每秒同步一次到磁盘(最多丢失 1 秒数据)。
优点:兼顾安全性和性能;缺点:若系统崩溃,可能丢失 1 秒内的数据。no
:由操作系统决定何时同步(可能几分钟一次)。
优点:性能最好;缺点:数据安全性最差。
-
优点:
- 数据安全性高,可配置不同的同步策略(如每秒同步、每次写操作同步)。
- AOF 文件是可读的文本格式,便于分析和修复。
- 支持 AOF 重写(自动压缩日志文件,去除冗余命令)。
-
缺点:
- AOF 文件通常比 RDB 文件大,尤其在频繁写操作场景下。
- 恢复速度比 RDB 慢,因为需要重放所有写命令。
- 若同步策略配置为
always
(每次写操作同步),可能影响性能。
3. RDS和AOF 的对比
维度 | RDB | AOF |
---|---|---|
持久化类型 | 快照(某时刻的数据副本) | 日志(记录写操作命令) |
文件大小 | 小(二进制压缩格式) | 大(文本格式,可能包含冗余命令) |
数据安全性 | 低(可能丢失最后一次快照后的数据) | 高(取决于同步策略,最多丢失 1 秒数据) |
恢复速度 | 快(直接加载快照) | 慢(重放所有写命令) |
性能影响 | 低(fork 子进程执行) | 高(频繁 IO 操作,尤其always 同步) |
适用场景 | 大规模数据恢复、备份 | 对数据安全性要求高的场景 |
4. 混合持久化(RDB + AOF)
Redis 4.0 引入了混合持久化模式,结合了 RDB 和 AOF 的优点
4.1. 什么是混合持久化?
混合持久化 = RDB 快照 + AOF 日志,是 Redis 4.0 引入的一种新持久化模式,结合了 RDB 的快速恢复能力和 AOF 的高数据安全性。
通俗解释 (说人话版):
-
场景:假如玩游戏时,混合持久化就像这样:
-
每小时自动存档(触发 AOF 重写):
- 游戏自动保存当前进度(生成 RDB 快照,比如 “已推掉中路二塔”)。
- 同时,把从存档之后到现在的所有操作记下来(比如 “买了吸血刀”“击杀敌方鲁班”)。
-
存档文件结构:
+---------------------+------------------------+ | 游戏存档进度 | 存档后新操作记录 | +---------------------+------------------------+ | 二进制数据(RDB) | 文本命令(如“买装备”) | +---------------------+------------------------+
-
重启游戏时:
- 先加载存档进度(快速恢复到 “推掉中路二塔” 的状态)。
- 再执行记录的新操作(依次 “买吸血刀”“击杀鲁班”),最终恢复到最新状态。
4.2. 混合持久化的工作原理
4.2.1 持久化过程
-
生成 RDB 快照:
当触发 AOF 重写(如文件大小增长超过阈值)时,Redis fork 子进程生成内存数据的二进制快照(RDB 格式),写入新的 AOF 文件开头。 -
追加 AOF 日志:
子进程生成快照期间,主进程继续处理写命令,这些命令会同时追加到旧 AOF 文件和AOF 重写缓冲区。 -
合并文件:
子进程完成 RDB 快照写入后,主进程将 AOF 重写缓冲区的命令追加到新 AOF 文件末尾,最终替换旧 AOF 文件。
4.2.2 文件结构
混合持久化后的 AOF 文件结构:
+---------------------+------------------------+
| RDB 快照数据 | AOF 格式的增量命令 |
+---------------------+------------------------+
| 二进制格式(RDB) | 文本格式(如 SET key val)|
+---------------------+------------------------+
4.2.3 恢复过程
当 Redis 重启时:
- 加载 RDB 快照:直接读取 AOF 文件开头的 RDB 部分,快速恢复数据到快照生成时刻的状态。
- 重放 AOF 日志:执行 RDB 快照之后记录的增量命令,恢复到最新数据状态。
5. 如何选择?
- 优先使用 AOF:若需要高数据安全性(如金融场景),且能接受较大文件和较慢恢复速度。
- 优先使用 RDB:若数据恢复速度是关键(如缓存场景),且能容忍一定数据丢失。
- 混合持久化:兼顾性能和安全性,推荐大多数场景使用。