Redis持久化方式
Redis 提供两种主要的持久化方式,用于将内存中的数据保存到磁盘,确保数据在服务重启后仍然可用。这两种方式分别是 RDB(Redis Database) 和 AOF(Append-Only File),它们各有优缺点,适用于不同的场景。
1. RDB(Redis Database)
原理
RDB 是 Redis 的快照式持久化方式,它会在指定时间间隔或手动触发时,将当前内存中的数据集全量快照保存到磁盘上的二进制文件(默认 dump.rdb
)。
触发方式
- 自动触发:通过配置文件
redis.conf
设置规则,如:save 900 1 # 900秒(15分钟)内至少1个键被修改 save 300 10 # 300秒(5分钟)内至少10个键被修改 save 60 10000 # 60秒内至少10000个键被修改
- 手动触发:
SAVE
:阻塞 Redis 主进程,直到 RDB 文件创建完成(生产环境慎用)。BGSAVE
:后台异步生成快照(推荐)。
优点
✅ 高性能:RDB 是二进制压缩存储,恢复速度快。
✅ 紧凑存储:文件体积小,适合备份和灾难恢复。
✅ 适合大数据集:恢复时直接加载整个快照,比 AOF 快。
缺点
❌ 数据丢失风险:如果 Redis 崩溃,最后一次快照后的数据会丢失。
❌ 频繁快照可能影响性能:BGSAVE
会 fork 子进程,大数据集可能导致短暂延迟。
2. AOF(Append-Only File)
原理
AOF 是日志式持久化方式,它会记录所有写操作(如 SET
、DEL
等),并以追加方式写入文件(默认 appendonly.aof
)。Redis 重启时,会重放 AOF 日志来恢复数据。
同步策略
AOF 的写入策略由 appendfsync
控制:
appendfsync always
:每次写操作都同步到磁盘(最安全,但性能最差)。appendfsync everysec
(默认):每秒同步一次(平衡安全性和性能)。appendfsync no
:由操作系统决定何时同步(最快,但可能丢失数据)。
AOF 重写(Rewrite)
由于 AOF 文件会不断增长,Redis 提供 BGREWRITEAOF
命令(或自动触发)来压缩日志:
- 移除冗余命令(如多次
SET
同一个 key,只保留最终值)。 - 生成更紧凑的新 AOF 文件,替换旧文件。
优点
✅ 数据安全性高:可配置为几乎零数据丢失(appendfsync always
)。
✅ 可读性强:AOF 是文本格式,便于人工分析或修复。
✅ 支持实时持久化:记录所有写操作,适合关键业务。
缺点
❌ 文件体积大:即使经过重写,AOF 通常比 RDB 大。
❌ 恢复速度慢:需要逐条执行命令,大数据集恢复时间较长。
❌ 写入压力大:高并发写入时,everysec
或 always
可能影响性能。
3. RDB vs AOF 对比总结
对比维度 | RDB | AOF |
---|---|---|
持久化方式 | 快照(全量备份) | 日志(增量记录) |
数据安全性 | 可能丢失最后一次快照后的数据 | 可配置为几乎零丢失 |
恢复速度 | 快(直接加载二进制文件) | 慢(需重放命令) |
文件大小 | 小(压缩存储) | 大(记录所有操作) |
对性能影响 | 快照时可能短暂阻塞 | 高频率写入可能增加 I/O 压力 |
适用场景 | 允许少量数据丢失,需要快速恢复 | 要求高数据安全,可接受较慢恢复 |
4. 如何选择?
单独使用
- 只用 RDB:适合缓存或允许少量数据丢失的场景。
- 只用 AOF:适合关键业务,如订单、支付等不能容忍数据丢失的场景。
混合模式(Redis 4.0+ 推荐)
同时启用 RDB 和 AOF:
- RDB 用于定期全量备份,提高恢复速度。
- AOF 用于记录增量操作,确保数据安全。
- 恢复时优先加载 AOF(数据更完整),如果 AOF 损坏,再尝试 RDB。
配置示例(redis.conf
):
save 900 1 # 启用 RDB
appendonly yes # 启用 AOF
appendfsync everysec # AOF 每秒同步
aof-use-rdb-preamble yes # 混合模式(Redis 4.0+)
5. 总结
- RDB 适合高性能、允许少量数据丢失的场景(如缓存)。
- AOF 适合高安全性、可接受较慢恢复的场景(如金融数据)。
- 混合模式(RDB+AOF)是生产环境推荐方案,兼顾性能与安全。
根据业务需求选择合适的持久化策略,或结合两者使用,以最大化 Redis 的可靠性和性能。