持久化机制
Redis 提供了两种持久化机制:RDB(快照持久化) 和 AOF(日志追加持久化),用于将内存中的数据持久化到磁盘,避免因进程退出或服务器宕机导致数据丢失。此外,Redis 4.0 引入了 混合持久化 模式,结合两者优势。以下是详细解析:
1、RDB(Redis Database)
核心原理
- 全量快照:将某一时刻的内存数据完整写入磁盘,生成
.rdb
文件。
- 触发方式:
- 自动触发:根据
redis.conf
中的配置规则(如 save 900 1
表示 900 秒内至少 1 次写操作则触发)。
- 手动触发:
SAVE
:阻塞主线程,直到快照完成(生产环境慎用)。
BGSAVE
:fork 子进程执行快照,主线程继续处理请求(推荐方式)。
- 执行流程:
- 主线程 fork 子进程,子进程负责写入快照(copy-on-write 机制,不影响主线程读写)。
- 子进程将内存数据序列化到临时文件。
- 替换旧的
.rdb
文件,完成持久化。
优缺点
优点 |
缺点 |
1. 文件体积小,恢复速度快(全量加载)。 |
1. 无法实时持久化,可能丢失最近写入的数据。 |
2. 适合备份(如定时同步到远程服务器)。 |
2. fork 子进程时可能占用大量内存和 CPU。 |
3. 跨版本兼容性好(不同 Redis 版本可读取)。 |
3. 大内存实例 fork 时可能导致短暂阻塞。 |
配置参数(redis.conf)
# 自动触发规则(可配置多个条件,用空格分隔)
save 900 1 # 900秒内至少1次写操作
save 300 10 # 300秒内至少10次写操作
save 60 10000 # 60秒内至少10000次写操作
stop-writes-on-bgsave-error yes # 快照失败时禁止写入(避免数据不一致)
rdbcompression yes # 是否压缩数据(牺牲CPU换取空间)
rdbchecksum yes # 写入时校验数据(增加文件生成时间)
dbfilename dump.rdb # 快照文件名
dir ./ # 快照存储目录(需提前创建,权限可写)
适用场景
- 对数据完整性要求不高,允许丢失最近几分钟数据。
- 需定期备份(如每天一次),用于灾难恢复。
- 主从复制场景(主节点通过 RDB 同步数据到从节点)。
2、AOF(Append Only File)
核心原理
- 增量日志:将每个写命令(如
SET
/HSET
等)按协议格式追加到 AOF 文件末尾,读命令不记录。
- 重写机制(AOF Rewrite):
- 随着时间推移,AOF 文件会变庞大(如多次
INCR
同一个键),通过 BGREWRITEAOF
命令优化:
- 子进程重新构建键值对的最小命令集合(如用最终的
SET
替代多次 INCR
)。
- 生成新的 AOF 文件,替换旧文件(不阻塞主线程)。
- 触发重写方式:
- 自动触发:根据
auto-aof-rewrite-percentage
(默认 100%,即文件大小较上次重写后增长 100%)和 auto-aof-rewrite-min-size
(默认 64MB,文件最小体积)。
- 手动触发:
BGREWRITEAOF
。
优缺点
优点 |
缺点 |
1. 数据安全性高(可配置每秒或实时刷盘)。 |
1. 文件体积通常大于 RDB(记录所有写命令)。 |
2. 支持实时持久化(根据 fsync 策略)。 |
2. 恢复速度较慢(需重放所有命令)。 |
3. 日志文件可读(便于排查问题)。 |
3. 重写时可能消耗大量 CPU 和 I/O。 |
配置参数(redis.conf)
appendonly yes # 启用 AOF(默认关闭)
appendfilename "appendonly.aof" # AOF 文件名
appendfsync always # 刷盘策略:
# always:每个写命令都刷盘(最慢,数据安全性最高)
# everysec:每秒刷盘(推荐,兼顾性能与安全)
# no:由操作系统决定(最快,风险高)
no-appendfsync-on-rewrite yes # 重写时是否停止刷盘(避免阻塞)
auto-aof-rewrite-percentage 100 # 触发重写的文件增长百分比
auto-aof-rewrite-min-size 64mb # 触发重写的最小文件大小
aof-load-truncated yes # 加载时忽略损坏的日志(避免启动失败)
aof-use-rdb-preamble yes # 混合持久化时,在 AOF 开头添加 RDB 内容
数据恢复流程
- 读取 AOF 文件,解析并执行所有写命令,重建内存数据。
- 若 AOF 文件损坏,可通过
redis-check-aof --fix
工具修复。
3、混合持久化(Hybrid Persistence)
核心原理
- Redis 4.0+ 新增:在 AOF 重写时,先将当前内存数据以 RDB 格式写入 AOF 文件开头,再追加增量的写命令。
- 优势:
- 结合 RDB 的快速恢复能力(加载时先读 RDB 部分)和 AOF 的增量日志(仅重放最近命令)。
- 减少 AOF 文件体积,提升恢复效率。
配置方式
aof-use-rdb-preamble yes # 开启混合持久化(默认开启)
4、两种持久化机制对比
维度 |
RDB |
AOF |
数据安全 |
低(可能丢失最后一次快照后的数据) |
高(取决于 fsync 策略) |
文件体积 |
小(压缩后) |
大(原始命令日志) |
恢复速度 |
快(全量加载) |
慢(重放所有命令) |
性能影响 |
fork 时可能阻塞主线程 |
每秒刷盘几乎无阻塞,always 会降低写入性能 |
适用场景 |
备份、主从同步、允许少量数据丢失 |
金融交易、实时数据要求高的场景 |