大数据 -46 Redis RDB 持久化机制详解:原理、配置与优缺点解析

点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI 篇持续更新中!(长期更新)
AI 炼丹日志-30-新发布【1T 万亿】参数量大模型!Kimi‑K2 开源大模型解读与实践,持续打造实用 AI 工具指南!📐🤖
💻 Java 篇正式开启!(300 篇)
目前 2025 年 07 月 16 日更新到:Java-74 深入浅出 RPC Dubbo Admin 可视化管理 安装使用 源码编译、Docker 启动 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务正在更新!深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300 篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解

RDB(Redis Database)是 Redis 默认的持久化方式,通过定期生成内存快照将数据保存为二进制文件 dump.rdb。当持久化触发时,Redis 主进程会 fork 子进程,子进程将当前数据写入临时文件并原子性替换旧文件,最大限度减少对主线程的影响。RDB 适用于灾难恢复和大数据量的快速重载,具备文件小、恢复快、性能影响小的优势。但也存在数据不完整的风险——可能丢失最后一次快照之后的更新数据。RDB 常配合 AOF 使用,在保证恢复速度的同时增强数据安全性。Redis 4.0 之后还支持混合持久化模式,兼具两者优点。
章节内容
上节完成了的内容如下:
Redis 持久化原因
Redis 持久化机制 RDB AOF
基础概念、适用场景等

RDB (Redis DataBase)
RDB(Redis DataBase)是 Redis 默认的持久化存储方式。它通过创建数据快照(snapshotting)的方式将内存中的数据定期保存到磁盘上。这种机制类似于给数据库拍一张瞬间的照片,保存当前时刻的所有数据状态。
工作原理
当 RDB 持久化被触发时,Redis 会:
主进程 fork 出一个子进程
子进程将当前内存中的数据写入临时 RDB 文件
写入完成后替换旧的 RDB 文件
整个过程主进程继续处理客户端请求(仅在 fork 时短暂阻塞)
触发方式
自动触发
符合 redis.conf 中配置的快照规则(save 指令)
当 Redis 正常关闭时(shutdown 命令)
手动触发
执行
SAVE
命令(同步操作,会阻塞所有客户端请求)执行
BGSAVE
命令(异步操作,后台执行)执行
FLUSHALL
命令(会先触发 RDB 保存)
特殊场景
主从复制时,主节点首次同步数据给从节点
当没有 AOF 持久化时,重启 Redis 会加载最近的 RDB 文件
配置参数
在 redis.conf 配置文件中,RDB 相关的核心配置包括:
优缺点
优点
全量备份,适合灾难恢复
文件紧凑,占用空间小
恢复大数据集时比 AOF 快
最大化 Redis 性能(子进程执行持久化)
缺点
可能丢失最后一次快照后的数据
数据集较大时 fork 操作可能耗时
频繁保存会影响性能
显式触发
执行流程

Redis 的 bgsave 过程详解
1. 父进程的初始检查
Redis 在执行 bgsave 命令时,父进程首先会进行状态检查:
检查当前是否有正在执行的子进程(如 Save、bgsave 或 bgrewriteaof)
如果存在活跃的子进程,bgsave 会立即返回错误信息
这个检查是为了避免同时执行多个磁盘 I/O 密集型操作导致性能下降
2. 父进程的 fork 操作
当确认可以执行 bgsave 后:
父进程调用 fork() 系统调用创建子进程
在 fork 操作期间,父进程会完全阻塞
这个阻塞时间取决于 Redis 实例的内存大小(通常几毫秒到几百毫秒)
在此期间,Redis 无法处理任何客户端命令,会出现短暂的不可用
3. fork 完成后的处理
fork 操作完成后:
父进程立即恢复运行,返回 "Background saving started" 响应
从此刻起,父进程可以正常处理所有客户端请求
父进程会记录 bgsave 的开始时间等统计信息
4. 子进程的 RDB 生成过程
子进程的工作流程:
基于 fork 时获取的父进程内存快照开始工作
将内存数据序列化为 RDB 格式,写入临时文件(默认名为 temp-[pid].rdb)
使用原子性操作(rename)将临时文件替换旧的 dump.rdb 文件
期间如果发生错误,会删除临时文件并记录错误日志
5. 完成通知与统计更新
完成 RDB 生成后:
子进程通过进程间通信向父进程发送完成信号
父进程收到信号后:
更新最后一次成功保存的时间戳
记录持久化耗时等信息
清理相关资源
子进程随后正常退出
注意事项
整个过程中,只有 fork 阶段会阻塞 Redis
RDB 生成期间的内存开销主要是写时复制(Copy-on-Write)带来的
如果 Redis 内存数据很大,fork 操作可能会很耗时
生产环境建议在低峰期执行 bgsave,并监控持久化耗时
文件结构

头部 5 字节固定位 REDIS
4 字节 RDB 版本号
辅助字段 以 KEY-VALUE
存储数据库号码
字典大小
过期 KEY
主要数据 以 KEY-VALUE
结束标志
校验和,看文件是否存坏,是否被修改
RDB 优点
RDB 是
二进制压缩
文件,采用 LZF 压缩算法进行压缩,占用空间小
(通常只有原数据的 1/4 大小),便于网络传输和备份存储主进程Fork子进程
进行持久化操作:子进程完成持久化工作,主进程继续处理命令请求
可以最大化 Redis 性能,避免持久化操作影响服务响应
注意事项:主进程内存占用不能太大,否则 fork 操作会:
消耗较多 CPU 资源
导致服务短暂阻塞(通常几十毫秒到几百毫秒)
在虚拟机环境下问题更明显
RDB 缺点
不保证
数据的完整性
:采用定时快照机制,两次快照之间的数据可能丢失
会
丢失最后一次快照以后的数据
:例如配置为每 5 分钟保存一次,在故障发生时可能丢失最近 5 分钟数据
不适合对数据完整性要求高的场景(如金融交易系统)
在服务器宕机等意外情况下数据丢失风险较大
AOF(Append Only File)持久化机制
AOF(Append Only File)是 Redis 提供的另一种持久化方式,与 RDB 方式不同,AOF 通过记录所有写操作命令来实现数据持久化。在 Redis 默认配置中,AOF 持久化是不开启
的,需要手动启用。
工作原理
Redis 会以追加写入
的方式将所有对数据库
执行的写入命令
(如 SET、LPUSH 等)按照 Redis 协议格式记录到AOF文件
中。当Redis重启
时,会读取 AOF 文件并按顺序执行
这些指令来重建数据状态。这种机制保证了数据的完整性,因为每个修改操作都被记录下来。
与 RDB 的区别
AOF 会记录过程,RDB 是保存结果。
具体表现为:
RDB 是定期生成数据快照,保存的是某个时间点的完整数据
AOF 则记录所有的写操作命令,保存的是数据变更的历史记录
AOF 文件通常比 RDB 文件大,但恢复更精确
RDB 恢复速度更快,AOF 恢复速度较慢但数据更完整
配置参数详解
要启用 AOF 持久化,需要修改 Redis 配置文件 redis.conf
:
使用建议
对于数据安全性要求高的场景,建议同时启用 RDB 和 AOF
生产环境通常使用 appendfsync everysec 平衡性能和数据安全
定期监控 AOF 文件大小,必要时手动执行 BGREWRITEAOF 命令
可以通过 redis-check-aof 工具修复损坏的 AOF 文件
具体原理
AOF 文件中存储的 Redis 的指令,具体过程有三个阶段:
命令传播:
Redis 将执行完的命令、参数等发送到 AOF 程序中缓存追加:
AOF 程序根据接收到的命令数据,将命令转换为网络通讯协议格式,再追加到服务器的 AOF 缓存中。文件写入保存:
AOF 缓存中的内容会被写入到 AOF 文件末尾,如果设定的 AOF 保存条件被满足的话,fsync 函数或者 fdatasync 函数会被调用,写入的内容被真正的保存到磁盘中
保存方式
可以配置保存的方式如下:
AOF_FSYNC_NO 不保存
AOF_FSYNC_EVERYSEC 每一秒钟保存一次
(默认)
AOF_FSYNC_ALWAYS 每一个指令保存一次

AOF 瘦身
平常会遇到如下的场景
或者是这种场景
Redis 不希望 AOF 重写造成服务器无法处理请求,所以 Redis 决定将 AOF 重写程序放入到后台中:
子进程 AOF 重写期间,主进程可以继续处理请求
子进程带有主进程的发数据副本,
使用子进程
不过使用子进程也有一个问题:
因为子进程在进行AOF重写期间
,主进程还需要继续处理命令,而新的命令
可能会对现有的数据进行修改
,这会让当前数据库
的数据和重写后
的 AOF 文件中的数据不一致
。为了解决不一致的问题
,Redis 加了一个 AOF 缓存,这个缓存在 Fork 出子进程之后,Redis 主进程接收到新的写命令时,除了会将这个命令追加到现有的 AOF 文件,还会追加
到这个缓存中。
具体的逻辑图如下:

触发方式
可以修改 redis.conf
显式触发
持久化混合模式详解
RDB 和 AOF 持久化对比
Redis 提供了两种主要的持久化方式,各有其优缺点:
RDB (Redis Database) 方式:
优点:
紧凑的二进制格式,文件体积小
恢复速度快,适合大规模数据恢复
对性能影响较小,因为采用子进程方式生成快照
缺点:
数据安全性较低,可能丢失最后一次快照后的数据
大数据量时,fork 操作可能阻塞主线程
AOF (Append Only File) 方式:
优点:
数据安全性高,最多丢失 1 秒的数据
可读性强,以日志形式记录每个写操作
支持后台重写,减少文件体积
缺点:
文件体积通常比 RDB 大
恢复速度较慢
对性能影响较大,特别是 fsync 策略设置为 always 时
混合持久化模式
从 Redis 4.0 版本开始,引入了 RDB+AOF 混合持久化模式,结合了两者的优势:
工作原理:
AOF 重写时,先将数据集以 RDB 格式写入 AOF 文件开头
之后的新增命令继续以 AOF 格式追加
这样生成的 AOF 文件包含两部分:RDB 格式的全量数据和 AOF 格式的增量数据
优势:
兼具 RDB 的快速恢复和 AOF 的数据安全性
与纯 AOF 相比,文件体积更小
恢复速度比纯 AOF 快
配置方法:在 redis.conf 配置文件中设置:
实际应用场景:
需要平衡数据安全性和恢复速度的业务
适合数据量较大但又不希望恢复时间太长的场景
可以替代单独使用 RDB 或 AOF 的方案
注意事项:
仅 Redis 4.0 及以上版本支持
在 Redis 重启时,会优先识别并加载 AOF 文件中的 RDB 部分
混合模式下的 AOF 文件可能比纯 AOF 更大,但比纯 RDB+纯 AOF 的组合要小
版权声明: 本文为 InfoQ 作者【武子康】的原创文章。
原文链接:【http://xie.infoq.cn/article/1e36f8db873b5d2f4a028fd48】。文章转载请联系作者。
评论