Redis 持久化详解:RDB、AOF、重写机制到底怎么选?
Redis 的数据主要存储在内存里,读写速度很快,但内存数据天然怕宕机。持久化的作用就是把内存里的数据落到磁盘,Redis 重启后可以从磁盘恢复。
课件里把 Redis 持久化分成两类:RDB 和 AOF。
一、RDB:把某一刻的数据做成快照
RDB 全称是 Redis Database Backup file,也叫 Redis 数据快照。简单说,就是把 Redis 内存中的数据在某个时间点整体记录到磁盘。
RDB 可以通过 save 或 bgsave 触发。
| 命令 | 特点 |
|---|---|
| save | 主进程执行,会阻塞所有命令 |
| bgsave | fork 子进程执行,主进程继续处理请求 |
实际生产中更常用 bgsave。
二、bgsave 和 Copy-on-Write
bgsave 执行时,Redis 主进程会 fork 出一个子进程。子进程共享主进程的内存数据,然后把这份数据写入 RDB 文件。
这里涉及 Copy-on-Write,也就是写时复制:
- 主进程执行读操作时,仍然访问共享内存。
- 主进程执行写操作时,才会复制一份被修改的数据页。
- 子进程继续基于 fork 时刻的视图生成 RDB。
RDB 的优点是文件紧凑,恢复速度快;缺点是两次快照之间的数据可能丢失。
三、AOF:把每一条写命令追加到文件
AOF 全称 Append Only File,意思是追加文件。Redis 会把处理过的每一条写命令记录到 AOF 文件里,可以把它理解成命令日志。
AOF 默认是关闭的,需要在 redis.conf 中开启:
appendonly yes
appendfilename "appendonly.aof"
AOF 的刷盘频率由 appendfsync 控制:
| 策略 | 含义 | 特点 |
|---|---|---|
| always | 每执行一次写命令就刷盘 | 最安全,性能最差 |
| everysec | 每秒刷盘一次 | 默认方案,性能和安全折中 |
| no | 由操作系统决定何时刷盘 | 性能最好,风险最大 |
生产中最常见的是 everysec。
四、AOF 重写:让日志变小
AOF 记录的是命令,所以文件可能越来越大。比如同一个 key 被多次修改:
set num 123
set name jack
set num 666
真正有意义的其实只有最终状态:
mset name jack num 666
AOF 重写就是用更少的命令表达相同的数据状态。可以手动执行:
bgrewriteaof
也可以通过配置自动触发:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
五、RDB 和 AOF 怎么选?
| 对比项 | RDB | AOF |
|---|---|---|
| 文件内容 | 数据快照 | 写命令日志 |
| 文件体积 | 较小 | 通常较大 |
| 恢复速度 | 较快 | 相对较慢 |
| 数据安全 | 可能丢失最近一次快照后的数据 | 更安全,最多丢失 1 秒左右 |
| 性能影响 | fork 和写快照时有影响 | 持续追加日志,有刷盘成本 |
如果只是缓存场景,数据可以从 MySQL 重新加载,RDB 通常够用。如果对数据安全性要求较高,实际开发中往往会 RDB 和 AOF 结合使用。
面试可以这样回答:
Redis 持久化主要有 RDB 和 AOF。RDB 是快照,恢复快、文件小,但可能丢失快照后的数据;AOF 是追加写命令,数据安全性更好,但文件更大,需要重写。生产中如果对数据安全要求较高,通常会两者结合,AOF 使用 everysec 做性能和安全的折中。
更多推荐




所有评论(0)