十一、redis 入门 之 数据持久化
一、概述
Redis 的 RDB(Redis Database) 和 AOF(Append Only File) 是两种核心持久化机制,用于将内存中的数据持久化到磁盘,避免服务重启后数据丢失
RDB
RDB 是一种 快照式 持久化方式:通过周期性生成内存中 全量数据的二进制快照文件(.rdb 文件),将某一时刻的完整数据状态保存到磁盘。恢复时直接加载该二进制文件到内存,快速恢复数据。
AOF
AOF 是一种 日志式 持久化方式:通过记录 Redis 所有 写操作命令(如 SET、HSET、LPUSH 等) 到文本文件(.aof 文件),恢复时通过 “重新执行” 文件中的命令,还原数据状态。
二、RDB
1、执行过程
触发机制:
- 自动触发:通过 Redis 配置文件(
redis.conf
)设置触发条件,例如:save 900 1
:900 秒内有 1 次键修改,触发 RDB;save 300 10
:300 秒内有 10 次键修改,触发 RDB;save 60 10000
:60 秒内有 10000 次键修改,触发 RDB。
- 手动触发:通过命令主动生成 RDB:
SAVE
:阻塞 Redis 主线程,直到 RDB 生成完成(不推荐生产环境,会导致服务不可用);BGSAVE
:fork 一个子进程负责生成 RDB,主线程继续处理客户端请求(生产环境常用)。
- 自动触发:通过 Redis 配置文件(
生成流程:
- 触发后,子进程(或主线程)读取内存中的全量数据;
- 将数据压缩为二进制格式,写入临时文件;
- 临时文件生成完成后,替换旧的 .rdb 文件(原子操作,避免文件损坏);
- 持久化完成,释放资源。
恢复流程:
- Redis 启动时,若检测到磁盘上有 .rdb 文件,会自动加载该文件到内存;
- 加载期间 Redis 阻塞客户端请求,加载完成后服务正常对外提供服务。
2、特性
- 文件格式:二进制文件,体积小、加载速度快(二进制解析效率高于文本);
- 数据丢失:最终一致性—— 两次 RDB 生成间隔内的数据(如刚修改但未触发快照)会丢失;
- 性能影响:
- 生成时(BGSAVE):fork 子进程会消耗少量内存(复制主线程页表),但主线程无阻塞;
- 恢复时:阻塞服务,适合数据量不大的场景;
- 灵活性:支持通过
stop-writes-on-bgsave-error
配置(默认开启)—— 若 BGSAVE 失败,Redis 停止接收写请求,避免数据不一致。
三、AOF
1、执行过程
AOF 的核心是 “命令记录 - 日志刷盘 - 命令重放”,关键依赖 刷盘策略 控制数据安全性:
命令记录流程:
- 客户端执行写命令,Redis 先执行命令(更新内存数据);
- 命令被追加到内存中的 AOF 缓冲区(aof_buf)(避免频繁磁盘 I/O);
- 根据配置的 刷盘策略,将缓冲区数据写入 .aof 文件。
关键:刷盘策略(配置
appendfsync
):appendfsync always
:每执行 1 条写命令,立即刷盘(最高安全性,但频繁 I/O 导致性能损耗最大);appendfsync everysec
:每秒刷盘 1 次(平衡安全性与性能,默认值)—— 最多丢失 1 秒内的数据;appendfsync no
:由操作系统决定刷盘时机(最低安全性,性能最好,依赖 OS 缓存,可能丢失大量数据)。
AOF 重写(避免日志文件膨胀):
- 问题:AOF 文件会随写命令累积而变大(如多次修改同一键,会记录多条 SET 命令),导致恢复变慢;
- 解决:AOF 重写—— 通过
BGREWRITEAOF
命令(或自动触发),fork 子进程将 “内存中当前数据” 转换为 “最少命令集”(如多条 SET key value 合并为 1 条),生成新 .aof 文件,替换旧文件; - 自动触发:通过
auto-aof-rewrite-percentage
(默认 100%)和auto-aof-rewrite-min-size
(默认 64MB)—— 当 AOF 文件体积比上次重写后大 100%,且当前体积 ≥64MB 时触发。
恢复流程:
- Redis 启动时,若同时开启 RDB 和 AOF,优先加载 AOF 文件(AOF 数据更完整);
- 逐行执行 .aof 文件中的命令,还原内存数据(若文件有损坏,可通过
redis-check-aof
工具修复)。
2. 关键特性
- 文件格式:文本文件(可直接查看命令,便于调试),体积较大(命令 + 参数存储);
- 数据一致性:高一致性—— 通过
always
策略可实现 “数据不丢失”(除非磁盘故障); - 性能影响:
- 记录时:刷盘策略决定性能(
everysec
是生产常用平衡方案); - 恢复时:命令逐行执行,数据量越大恢复越慢(比 RDB 慢);
- 记录时:刷盘策略决定性能(
- 可靠性:支持 “破损文件修复”,通过
redis-check-aof --fix
可移除 AOF 文件中无效的命令。
四、对比
- 若需 快速备份、灾备传输、数据量小,优先用 RDB;
- 若需 生产环境高数据一致性、避免数据丢失,优先用 AOF(刷盘策略选
everysec
); - Redis 4.0+ 推荐开启 混合持久化,平衡性能与安全性。
五、混合持久化(Redis 4.0+ 特性)
为结合 RDB 和 AOF 的优势,Redis 4.0 引入 混合持久化(配置 aof-use-rdb-preamble yes
):
- 原理:AOF 重写时,先将当前内存数据以 RDB 格式写入新 AOF 文件开头,再将重写后的增量命令以 AOF 格式追加到后面;
- 优势:恢复时 —— 先快速加载 RDB 部分(全量数据),再执行 AOF 增量命令(补全最新数据),兼顾 “恢复速度” 和 “数据完整性”。