什么是持久化?
Redis 是基于内存的数据库,如果服务器宕机,内存数据将全部丢失。为了防止数据丢失,Redis 提供了 持久化机制(Persistence),将数据保存到磁盘上,实现数据恢复。
Redis 持久化方式一览
持久化方式 | 简称 | 类型 | 特点 |
---|---|---|---|
RDB 快照 | RDB | 全量备份 | 内存快照,适合备份和灾难恢复 |
AOF 追加日志 | AOF | 增量日志 | 日志式恢复,数据更完整 |
混合持久化 | AOF+RDB | RDB + AOF | Redis 4.0+ 默认更安全模式 |
一、RDB(Redis DataBase)快照持久化
工作原理
RDB 是将 内存中的数据快照 定时保存为一个二进制文件(dump.rdb
),通常在以下情况触发:
- 手动执行命令
SAVE
或BGSAVE
- 配置项触发
save 900 1
等 - 主从复制时(RDB 传输)
- 重启 Redis,若有 RDB 文件会自动加载
实现过程
- 执行
BGSAVE
,Redis fork 出子进程 - 子进程将内存数据序列化并写入 RDB 文件
- 主进程继续处理请求
子进程结束后,替换旧的 RDB 文件
配置示例(redis.conf):
save 900 1 # 900秒内至少1个键发生变化
save 300 10 # 300秒内至少10个键变化
save 60 10000 # 60秒内至少10000个键变化
优点
- 对性能影响小,主进程持续响应
- 文件小,压缩好,适合备份/容灾
- 启动恢复速度快
缺点
- 数据不实时,可能丢失最后一次快照后的数据
- fork 子进程消耗内存,频繁快照影响性能
二、AOF(Append Only File)日志持久化
工作原理
AOF 是将 Redis 执行的 每一条写命令 追加写入日志文件(appendonly.aof
),可以完整记录数据库操作。
写入流程
- 每次写命令写入
aof_buf
缓冲区 - 按策略同步写入磁盘(fsync)
- AOF 重启时逐条命令重放恢复数据
配置项(redis.conf)
appendonly yes # 开启 AOF
appendfsync always # 每次写操作都 fsync(慢但最安全)
appendfsync everysec # 每秒 fsync 一次(默认推荐)
appendfsync no # 交由操作系统决定时机
重写机制(AOF Rewrite)
AOF 会越来越大,Redis 会自动触发重写(rewrite):
- 将当前数据生成最小命令集(替换旧日志)
- 不影响原文件写入,使用双缓冲技术
优点
- 数据更安全(可控 fsync 策略)
- 支持命令重放,恢复能力强
- 文件内容清晰可读(文本格式)
缺点
- 文件大,性能开销高于 RDB
- 每条写命令都记录,对写频繁系统负担大
- 启动恢复慢(需重放所有命令)
三、混合持久化(Hybrid Persistence)
从 Redis 4.0 开始,引入混合持久化模式,结合 RDB 的性能与 AOF 的完整性。
原理
- 在 AOF 重写时,将 RDB 快照内容写入 AOF 文件头部
- 后续追加正常命令
配置项(redis.conf)
aof-use-rdb-preamble yes
优点
- 加快重启恢复速度(先加载快照)
- 保留日志完整性
- 缩小 AOF 文件体积
四、持久化机制总结对比
特性 | RDB 快照 | AOF 日志 | 混合持久化 |
---|---|---|---|
数据恢复速度 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
数据完整性 | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
文件体积 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
性能开销 | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
是否推荐 | ✔ 备份场景 | ✔ 高可靠场景 | ✔ 默认推荐模式 |
五、常见问题
如何关闭持久化?
可配置关闭持久化:
save ""
appendonly no
适用于完全临时缓存场景。
RDB 和 AOF 可以同时开启吗?
是的。Redis 会优先使用 AOF 文件恢复(数据更新更完整),除非 AOF 文件损坏。
如何触发持久化手动执行?
# 手动生成 RDB 快照
redis-cli SAVE
redis-cli BGSAVE
# 手动 AOF 重写
redis-cli BGREWRITEAOF
总结
- 小型系统:RDB 单独使用,适合容灾备份
- 高可靠系统:AOF,保障写入日志完整
- 大多数系统:开启混合持久化(推荐默认)