重启就丢数据?那 Redis 和内存有啥区别。持久化就是给 Redis 上个“保险”。
本次导航
- RDB:内存快照,定期备份,适合灾难恢复
- AOF:操作日志,每次写入都记下来,更可靠
- 混合持久化:RDB + AOF 的合体(Redis 4.0+)
- 怎么选:数据安全 vs 性能,你站哪边?
- 图解:RDB 和 AOF 的工作流程对比
发车前提醒:学完前面几种数据结构,该考虑“怎么把数据留住”了。持久化就是干这个的。
一、为啥需要持久化?
Redis 的数据默认存在内存里。一断电、一重启,啥都没了。
持久化就是把内存里的数据保存到硬盘上,下次启动时再读回来。
Redis 提供了两种持久化方案:
- RDB(Redis Database):在某个时间点把整个内存数据拍一张“快照”,存成
.rdb文件。 - AOF(Append Only File):把每一条写命令都追加到
.aof文件里(类似 MySQL 的 binlog)。
它们可以单独用,也可以一起用。下面一个个说。
二、RDB:定时拍照,恢复快
2.1 工作原理
RDB 会在你指定的时间间隔内,把内存里的所有数据fork 一个子进程,由子进程写入磁盘。主进程继续处理请求,不阻塞。
2.2 怎么配置
在redis.conf里:
save 900 1 # 900 秒内至少有 1 个 key 变化,就触发 bgsave save 300 10 # 300 秒内至少有 10 个 key 变化 save 60 10000 # 60 秒内至少有 10000 个 key 变化也可以手动触发:SAVE(阻塞主进程,不建议)或BGSAVE(后台 fork 子进程,推荐)。
2.3 优点 vs 缺点
| 优点 | 缺点 |
|---|---|
| 文件紧凑,恢复速度快(直接加载) | 可能丢数据:最后一次快照之后的写操作全没 |
| 适合备份、灾备(可以拷贝到其他地方) | 数据集大时 fork 子进程会短暂卡顿 |
| 恢复比 AOF 快很多 | 不能实时持久化 |
三、AOF:记操作日志,更可靠
3.1 工作原理
每一条写命令(SET、HSET、LPUSH等),Redis 都会追加到appendonly.aof文件末尾。重启时,Redis 会逐条执行 AOF 里的命令来恢复数据。
3.2 同步策略(关键!)
appendfsync配置决定什么时候把缓冲区刷到磁盘:
| 策略 | 说明 | 数据安全性 | 性能 |
|---|---|---|---|
always | 每次写命令都立即 fsync | 最安全,最多丢一条命令 | 最慢 |
everysec | 每秒 fsync 一次 | 最多丢 1 秒内的数据 | 折中,推荐 |
no | 交给操作系统决定 | 可能丢很多(OS 崩溃时) | 最快 |
配置示例:
appendonly yes appendfsync everysec3.3 AOF 重写(避免文件无限膨胀)
AOF 会记录每一条命令,可能很快变大。比如你INCR counter一百次,AOF 会记 100 条命令。重写机制会把它压缩成一条SET counter 100。
自动触发:auto-aof-rewrite-percentage 100和auto-aof-rewrite-min-size 64mb。
也可以手动:BGREWRITEAOF。
3.4 优点 vs 缺点
| 优点 | 缺点 |
|---|---|
| 数据更安全(最多丢 1 秒) | 文件比 RDB 大 |
| 写操作实时记录,可读性好(可以 cat 看命令) | 恢复速度比 RDB 慢(要逐条执行) |
| 适合做主从复制的备库 | 频繁 fsync 会影响性能 |
四、混合持久化(Redis 4.0+)—— 最佳实践
4.1 它是啥?
RDB 恢复快但丢数据多,AOF 安全但恢复慢。混合持久化把两者结合:
- AOF 文件开头是 RDB 格式的数据(内存快照)
- 后面追加 AOF 格式的增量命令
4.2 怎么开启
aof-use-rdb-preamble yes # Redis 4.0 开始支持,默认开启4.3 效果
重启恢复时,先加载 RDB 部分(极快),再重放 AOF 部分的增量命令。既快又安全。
五、怎么选?
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 缓存服务,丢数据影响不大 | 仅 RDB,甚至不持久化 | 性能优先,重启后从 DB 回填 |
| 重要数据,不能丢 | AOF + everysec | 最多丢 1 秒数据 |
| 既要性能又要相对安全 | 混合持久化(默认配置) | RDB 快速恢复 + AOF 增量 |
| 主从复制架构 | 都开,但 slave 可不开 AOF | 从库承担持久化压力 |
| 单纯做消息队列(Streams) | AOF + everysec | 消息不能丢 |
个人建议:生产环境都开。主节点开 AOF(everysec)+ RDB,从节点可以只开 RDB。
六、常用运维命令
| 命令 | 作用 |
|---|---|
BGSAVE | 后台生成 RDB 快照 |
BGREWRITEAOF | 手动重写 AOF 文件(压缩) |
LASTSAVE | 查看最后一次成功生成 RDB 的时间戳 |
INFO persistence | 查看持久化状态(rdb_last_save_time、aof_size 等) |
CONFIG GET appendonly | 查看 AOF 是否开启 |
欢迎点赞、关注、转发~
有任何疑问,留言区见!🚀