Redis的持久化RDB、AOF 精讲
Redis的持久化方式
Redis 提供两种持久化方式
1.RDB(Redis Database Backup)
Redis RDB(Redis Database Backup)是一种快照持久化机制,它会在指定的时间点将 Redis 数据库的状态保存到一个二进制文件中。RDB 文件是某个时间点的数据快照,适合用于灾难恢复和备份。
1.1RDB 快照的生成
RDB 文件可以通过以下几种方式生成:
save 命令:手动执行
save命令会阻塞 Redis 主进程,直到 RDB 文件创建完成。这意味着在save执行期间,Redis 不能处理其他客户端请求。bgsave 命令:手动或通过配置规则自动触发
bgsave命令,Redis 会 fork 出一个子进程来创建 RDB 文件,主进程可以继续处理客户端请求,因此对性能影响较小。
1.2 Fork子进程的优缺点
因为会Fork出一个子进程来生成RDB文件并且子进程和主进程的页表指向的物理内存都是同一块区域,此时主进程产生修改原来缓存的内容,就不能直接修改页表对应的物理内存地址中的内容,而是需要写时复制 来解决,在修改原来的内容时 会复制一块一模一样的副本,且原来页表指向新的副本进行修改,而不会直接去修改原来的物理块
!但是写时复制是把双刃剑,在极端情况下 在进行RDB快照生成时,缓存中所有的数据都被修改,那么内存占用将会达到双倍

1.2 自动触发规则
根据 redis.conf 中配置的规则自动触发 bgsave。例如:
save 900 1
save 300 10
save 60 10000这些配置项表示,在 900 秒内至少有 1 个键发生变化、300 秒内至少有 10 个键发生变化、或者 60 秒内至少有 10000 个键发生变化时,自动触发一次 RDB 持久化。
2.AOF(Append Only File)
2.1 什么是AOF
AOF(Append Only File) 是 Redis 提供的另一种持久化方式。与 RDB 不同,AOF 持久化记录的是客户端对数据库执行的所有写操作命令(如 SET, DEL, HSET 等),以 Redis 客户端请求协议的格式追加到一个日志文件中。
简单来说:
AOF 文件是一个只追加的日志文件,保存了所有改变 Redis 数据的写命令。
2.2 怎么开启AOF
⚠️ AOF 持久化配置默认是关闭的,所以需要手动打开。打开后就可以写入持久化文件 appendonly.aof 中
appendonly yes
2.3 AOF 的工作流程
- 命令写入缓冲区:
- Redis 主进程在处理完写命令后,会将该命令追加到内存中的 AOF 缓冲区(
aof_buf)。
- Redis 主进程在处理完写命令后,会将该命令追加到内存中的 AOF 缓冲区(
- 根据策略刷盘:
- Redis 根据配置项
appendfsync决定何时将缓冲区内容写入磁盘。
- Redis 根据配置项
- 异步重写(AOF Rewrite):
- 随着时间推移,AOF 文件可能变得冗余庞大(比如多次修改同一个 key),Redis 可以通过
BGREWRITEAOF命令进行 AOF 文件重写,压缩其大小并优化结构。
- 随着时间推移,AOF 文件可能变得冗余庞大(比如多次修改同一个 key),Redis 可以通过
2.4 AOF 的三种同步策略(appendfsync)
| 配置项 | 行为 | 数据安全性 | 性能 |
|---|---|---|---|
always | 每次写命令都同步刷盘(调用 fsync) | ✅ 最高(最多丢 1 条命令) | ❌ 最低 |
everysec | 每秒批量刷盘一次(默认) | ✅ 较高(最多丢 1 秒数据) | ✅ 平衡 |
no | 由操作系统决定何时刷盘(通常每 30 秒) | ❌ 最低(可能丢失较多数据) | ✅ 最高 |
2.5 AOF 重写(Rewrite)机制
2.5.1 为什么需要 AOF 重写?
随着 Redis 的运行,AOF 文件可能会变得非常大,例如:
- 对同一个 key 多次赋值(如
SET key 1→SET key 2→SET key 3),重写后就会只记录 SET key 3 这一个记录 - 执行了很多删除操作(这些操作不会被自动清理)
为了减少 AOF 文件体积并提高恢复效率,Redis 提供了 AOF 重写功能。
2.5.2 如何触发?
- 手动触发:发送命令
BGREWRITEAOF - 自动触发:通过配置项控制,如:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb📌 配置详解
1. auto-aof-rewrite-percentage 100
- 含义:表示当前 AOF 文件大小相对于上一次重写后的 AOF 文件大小的增长百分比。
- 默认值为 100 表示:
当前 AOF 文件大小超过上一次重写后文件大小的 100%(即翻倍) 时,Redis 将考虑触发一次自动 AOF 重写。
📌 举例说明:
- 上次重写后的 AOF 文件大小是 64MB;
- 当前 AOF 文件大小达到 128MB(64MB × 2),就会满足这个条件。
2. auto-aof-rewrite-min-size 64mb
- 含义:表示触发 AOF 重写的最小文件大小。
- 默认值为 64MB 表示:
只有当 AOF 文件大小 大于等于 64MB 时,才允许根据增长比例来判断是否触发重写。
📌 作用:防止 Redis 在 AOF 文件还很小的时候就频繁进行重写,浪费资源。
2.5.3 工作原理:
- Redis 主进程 fork 出一个子进程。
- 子进程读取当前数据库的数据,并将其转换为最小化的等效命令集合(如只保留最终值)。
- 新的 AOF 文件生成后,替换旧的 AOF 文件(原子操作)。
⚠️ AOF 重写期间主进程仍然接收写请求,这些新命令会被缓存并在重写完成后追加到新 AOF 文件中。