# Redis的持久化机制是什么?RDB和AOF有什么区别?
# 简要回答
- Redis 持久化的核心方案有两种:
RDB快照和AOF追加日志。除此之外,生产中也常见RDB + AOF或混合持久化方案。 RDB是在某个时间点把内存数据做成快照落盘,优点是文件紧凑、恢复速度快,缺点是两次快照之间的数据可能丢失。AOF是把写命令按追加方式记录到文件中,优点是数据更完整、可通过刷盘策略控制丢失范围,缺点是文件更大、恢复通常比RDB慢。- 如果同时开启
RDB和AOF,Redis 重启时通常会优先使用AOF文件恢复,因为它通常更完整。
# 详细回答
- 为什么 Redis 需要持久化
- Redis 是内存数据库,数据默认存在内存里。如果进程宕机、机器重启、实例迁移,内存里的数据会丢失。
- 所以如果 Redis 不只是做纯缓存,而是还承载了重要业务数据,就需要持久化机制把数据落到磁盘。
RDB(Redis DataBase)快照RDB的思路是在某一个时刻,把当前内存中的数据整体生成快照,写到磁盘文件里,默认文件名通常是dump.rdb。- 常见触发方式:根据配置规则自动触发,如
save 900 1、或者可以手动执行SAVE或BGSAVE - 两个命令的区别:
SAVE会同步保存,会阻塞主线程,因此生产中很少直接使用。而BGSAVE是后台保存,Redis 会fork子进程生成快照,主线程继续处理请求。 - 优点:rdb的文件体积通常更小,适合备份、全量复制,恢复速度通常比 AOF 更快
- 缺点:但是RDB不能保证实时性,两次快照之间的数据可能丢失。
fork子进程时会带来额外内存和短暂开销
AOF(Append Only File)追加日志AOF的思路是把每一条会修改数据的写命令追加到 AOF 文件中,Redis 重启时重新执行这些命令完成恢复。- 常见刷盘策略由
appendfsync控制:如果是always则每次写命令都刷盘,最安全但性能开销最大;everysec在每秒刷盘一次,性能和安全性比较均衡,生产中很常见;如果选择no,则由操作系统决定何时刷盘,性能最好但数据风险更高。 - 优点:数据丢失窗口通常比
RDB更小,文件里是写命令,可读性比二进制快照更强。 - 缺点:文件通常比
RDB大,恢复时需要重放命令,通常比RDB慢
AOF重写:如果 AOF 一直追加,文件会越来越大,所以 Redis 提供了BGREWRITEAOF机制,用更精简的命令重新生成一份新的 AOF 文件。例如对同一个 key 的多次INCR、SET,重写后可以合并成更少的命令,减少文件体积。- 混合持久化
- 在较常见的生产配置里,会采用
AOF与RDB结合的方式。 - 混合持久化的典型思路是:重写 AOF 时,前半段使用 RDB 快照格式保存全量数据,后半段再追加增量写命令。
- 这样既能保留 RDB 恢复快的优点,又能保留 AOF 数据更完整的优点。
- 在较常见的生产配置里,会采用
- 实际开发中,应该根据场景类型决定,如果是纯缓存场景,数据丢了可以从数据库重建,甚至可以关闭持久化来换性能,在重要数据场景下,通常至少开启
AOF everysec,如果希望恢复更快,同时兼顾数据安全:可以使用RDB + AOF或混合持久化。
# 知识图解
- Redis 持久化方案对比
| 方案 | 核心思路 | 优点 | 缺点 |
|---|---|---|---|
RDB | 定期生成内存快照 | 文件小,恢复快 | 两次快照之间可能丢数据 |
AOF | 追加写命令日志 | 数据更完整 | 文件更大,恢复较慢 |
| 混合持久化 | RDB 快照 + AOF 增量 | 恢复更快且更完整 | 配置和机制更复杂 |
- RDB和AOP持久化示意

# 代码示例
save 900 1
save 300 10
save 60 10000
# 开启 AOF
appendonly yes
# AOF 每秒刷盘一次
appendfsync everysec
# 手动触发 RDB 快照
BGSAVE
# 手动触发 AOF 重写
BGREWRITEAOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 知识扩展
- 扩展:
- Redis 在执行
BGSAVE或BGREWRITEAOF时通常会fork子进程,因此大内存实例在高峰期做持久化要特别关注内存和延迟抖动。 - 如果既开启了
RDB又开启了AOF,Redis 重启恢复时一般优先使用AOF文件。
- Redis 在执行
- 面试官可能追问:
- Q1:为什么生产环境更常见
appendfsync everysec?- 因为它在性能和可靠性之间比较平衡。极端情况下通常最多丢失 1 秒左右的数据,但比
always的刷盘开销小很多。
- 因为它在性能和可靠性之间比较平衡。极端情况下通常最多丢失 1 秒左右的数据,但比
- Q2:
BGSAVE为什么比SAVE更常用?- 因为
SAVE会阻塞主线程,期间 Redis 不能正常处理请求;BGSAVE通过后台子进程生成快照,对线上影响更小。
- 因为
- Q3:为什么 AOF 还需要重写?
- 因为 AOF 是追加日志,时间长了文件会非常大,重写可以把重复、冗余的历史命令压缩成更精简的结果,降低磁盘占用和恢复耗时。
← Redis过期策略 缓存雪崩、穿透、击穿 →
评论
验证登录状态...