持久化机制

Redis 是内存数据库,持久化机制确保数据不会因进程退出或服务器宕机而丢失。

持久化方式概览 ⭐⭐⭐⭐⭐

Redis 提供了 3 种持久化方式:

方式
说明
优点
缺点

RDB

快照(Snapshot)

文件小、恢复快、性能影响小

可能丢失最后一次快照之后的数据

AOF

追加日志(Append Only File)

数据安全性高、可读性好

文件大、恢复慢、性能影响大

混合持久化

RDB + AOF 混合(4.0+)

结合两者优点

Redis 4.0+ 才支持


RDB 持久化 ⭐⭐⭐⭐⭐

工作原理

RDB 持久化是通过创建快照的方式,将某个时间点的所有数据保存到磁盘。

触发方式

  1. 手动触发SAVEBGSAVE 命令

  2. 自动触发:配置文件中的 save 规则

SAVE vs BGSAVE

命令
阻塞
实现方式
使用场景

SAVE

主进程直接执行,阻塞所有请求

几乎不用(会阻塞服务)

BGSAVE

fork 子进程执行,主进程继续处理请求

生产环境使用

BGSAVE 流程

fork 时的 Copy-On-Write(COW)机制

配置详解

redis.conf 配置

RDB 文件格式

手动触发示例

RDB 的优缺点

优点

  1. 文件紧凑:全量快照,文件小,适合备份和灾难恢复

  2. 恢复速度快:直接加载 RDB 文件,速度快于 AOF

  3. 性能影响小:使用子进程,对主进程性能影响小

  4. 适合大规模数据恢复:可以快速恢复 GB 级数据

缺点

  1. 数据丢失风险:两次快照之间的数据可能丢失

  2. fork 耗时:数据量大时,fork 可能耗时较长(几百 ms)

  3. 不适合实时性要求高的场景:RDB 间隔时间长,可能丢失较多数据

使用场景

  • 数据备份:定期备份 RDB 文件到其他服务器

  • 灾难恢复:RDB 文件可快速恢复数据

  • 从节点持久化:主从架构中,从节点使用 RDB

  • 可接受分钟级数据丢失的场景


AOF 持久化 ⭐⭐⭐⭐⭐

工作原理

AOF(Append Only File)通过记录写命令的方式持久化数据。

流程

开启 AOF

redis.conf 配置

同步策略:appendfsync ⭐⭐⭐⭐⭐

策略
说明
性能
安全性
数据丢失

always

每个写命令都同步到磁盘

几乎不丢失

everysec

每秒同步一次(默认)

较高

最多丢失 1 秒数据

no

由操作系统决定何时同步

最好

可能丢失多秒数据

推荐配置

AOF 重写 ⭐⭐⭐⭐⭐

为什么需要重写?

重写方式

1. 手动触发

2. 自动触发

重写流程

重写优化

AOF 文件格式

AOF 文件是纯文本格式,使用 RESP 协议

查看 AOF 文件

AOF 损坏修复

检查 AOF 文件

修复 AOF 文件

AOF 的优缺点

优点

  1. 数据安全性高:everysec 模式最多丢失 1 秒数据

  2. 可读性好:AOF 文件是文本格式,易于分析和修改

  3. 支持增量备份:可以通过 AOF 文件回放历史操作

  4. 自动重写:避免文件过大

缺点

  1. 文件大:比 RDB 文件大得多

  2. 恢复慢:需要回放所有命令,速度慢于 RDB

  3. 性能影响:写入频繁时,fsync 会影响性能

  4. 可能出现 Bug:AOF 重写逻辑复杂,曾有 Bug 导致数据不一致

使用场景

  • 数据安全性要求高:金融、电商等场景

  • 可容忍一定性能损耗:写入不是特别频繁的场景

  • 需要数据审计:可通过 AOF 文件回溯操作历史


混合持久化 ⭐⭐⭐⭐⭐

什么是混合持久化?

Redis 4.0 引入了混合持久化(RDB-AOF Hybrid Persistence),结合了 RDB 和 AOF 的优点。

原理

开启混合持久化

混合持久化的优势

对比项
RDB
AOF
混合持久化

文件大小

适中(RDB 部分小)

恢复速度

快(RDB 部分快速加载)

数据安全

好(AOF 增量保证)

兼容性

Redis 4.0+

最佳实践


RDB vs AOF vs 混合持久化 ⭐⭐⭐⭐⭐

对比表

特性
RDB
AOF
混合持久化

启动优先级

高(AOF 优先)

文件大小

适中

恢复速度

数据完整性

可能丢失分钟级数据

最多丢失 1 秒

最多丢失 1 秒

CPU 占用

高(fsync)

适中

内存占用

fork 时可能 2 倍

稍高(缓冲区)

fork 时可能 2 倍

适用场景

备份、从节点

生产主节点

生产主节点(推荐)

启动时的加载优先级

如何选择?

纯缓存场景(可接受数据丢失):

数据重要场景(不能接受数据丢失):

极致性能场景(内存充足):


持久化性能优化 ⭐⭐⭐⭐

1. 合理配置 fork 优化

2. 避免磁盘 I/O 瓶颈

3. 监控持久化状态

4. 避免大 key


常见问题 ⭐⭐⭐⭐⭐

Q1: Redis 挂了数据会丢失吗?

:取决于持久化配置:

  • RDB:可能丢失最后一次快照之后的所有数据(分钟级)

  • AOF(everysec):最多丢失 1 秒数据

  • AOF(always):几乎不丢失数据(性能差)

  • 无持久化:所有数据丢失

Q2: RDB 和 AOF 能同时开启吗?

:可以,且推荐同时开启。

  • Redis 重启时优先加载 AOF 文件(数据更完整)

  • RDB 可用于备份和灾难恢复

Q3: fork 操作会阻塞主进程吗?

:会,但时间很短(几毫秒到几百毫秒)。

  • fork 只是复制页表,不复制数据

  • 数据量越大,fork 耗时越长

  • 可通过 INFO stats 查看 latest_fork_usec

Q4: AOF 文件损坏怎么办?

:使用 redis-check-aof 工具修复:

Q5: 如何实现数据备份?

  1. 手动备份:定期执行 BGSAVE,复制 RDB 文件到其他服务器

  2. 自动备份:定时任务(cron)备份 RDB 文件

  3. 主从备份:搭建从节点,从节点自动同步数据

Q6: Redis 4.0 之前没有混合持久化怎么办?

:同时开启 RDB 和 AOF:


面试要点 ⭐⭐⭐⭐⭐

高频问题

Q1: Redis 的持久化方式有哪些?

  • RDB(快照)、AOF(日志)、混合持久化(RDB + AOF)

Q2: RDB 和 AOF 的区别?

  • RDB:全量快照,文件小,恢复快,可能丢失分钟级数据

  • AOF:记录写命令,文件大,恢复慢,最多丢失 1 秒数据

Q3: AOF 的三种同步策略是什么?

  • always:每次写入都同步,安全但慢

  • everysec:每秒同步一次,推荐

  • no:由 OS 决定,快但不安全

Q4: 什么是 AOF 重写?

  • 遍历内存数据,生成最小命令集,压缩 AOF 文件大小

  • 通过 fork 子进程异步执行,不阻塞主进程

Q5: 混合持久化的优势是什么?

  • 文件大小适中(RDB 部分紧凑)

  • 恢复速度快(RDB 部分快速加载)

  • 数据安全性高(AOF 增量保证)

Q6: Redis 重启时如何加载数据?

  • 优先加载 AOF(如果开启)

  • 否则加载 RDB

  • 都没有则空实例启动

Q7: fork 操作的原理是什么?

  • 复制父进程的页表,不复制数据(Copy-On-Write)

  • 只有修改时才复制对应内存页

  • 数据量大时,fork 可能耗时较长


参考资料

  1. 书籍推荐

    • 《Redis 设计与实现》(黄健宏)

    • 《Redis 开发与运维》(付磊、张益军)

Last updated