Redis持久化详解:RDB与AOF原理、配置、优缺点

一、前言:为什么Redis需要持久化?

Redis 是一款基于内存的高性能数据库,所有数据默认存储在内存中,读写速度极快,但内存数据具有易失性。一旦服务器断电、进程崩溃、机器重启,内存中的所有数据会全部丢失。

而 Redis 持久化机制的核心作用就是:将内存中的数据定期存储到磁盘,保证服务重启后能够恢复数据,避免数据丢失

二、Redis持久化整体概述

Redis 官方提供了两种独立的持久化方式,二者可单独开启,也可混合开启。

  1. RDB(Redis Database Backup):数据快照,将某一时刻的全量内存数据,以二进制文件形式保存到磁盘。

  2. AOF(Append Only File):将客户端执行的每一条写命令,都写入磁盘,重启时读取AOF文件恢复数据。

三、RDB 持久化(快照持久化)

3.1 核心原理

RDB 是全量快照持久化,Redis 会在指定时间间隔内,将内存中所有数据以二进制方式存储到文件,保存到磁盘。

其核心实现依赖 fork 子进程:Redis 主进程不会执行 IO 操作,而是通过 fork 创建子进程,由子进程对当前父进程内存数据的复制,并写入到新的AOF文件中。

fork 机制特点:采用写时复制(COW),fork 瞬间子进程共享父进程内存数据,若父进程后续有新的写操作,操作系统会复制对应内存页给父进程,父进程在新的内存页上面进行修改,子进程还持有原来内存数据,不受影响。

3.2 RDB 触发方式

RDB 分为自动触发手动触发两种场景:

1,自动触发

在配置文件中设置 save + 时间 + 触发多少次 这样的配置来自动触发RDB

2,手动触发(客户端命令)

save :主进程直接执行 RDB 持久化,阻塞主线程,数据量大时会导致 Redis 卡顿,生产环境禁止使用。

bgsave :后台触发,fork 子进程执行持久化,不阻塞主进程,对于生产环境手动触发首选。

3,特殊自动触发场景

执行flushall,flushdb清空数据时,会自动触发 RDB,保存空数据快照;

Redis 正常关机(shutdown)时,会自动执行 bgsave 持久化。

3.4 RDB 数据恢复流程

Redis 启动时,会自动读取当前目录下的 dump.rdb 文件,将快照数据加载到内存,完成数据恢复。

优先级规则:同时存在 RDB 和 AOF 文件时,优先加载 AOF 文件(AOF 数据完整性更高)。

3.5 RDB 优缺点总结

优点
  1. 文件体积小:二进制压缩文件,存储全量数据,占用磁盘空间远小于 AOF 日志;

  2. 恢复速度快:直接加载全量快照,无需重放日志,大数据量恢复效率极高;

  3. 性能损耗低:bgsave 依赖子进程,主进程几乎无 IO(程序和外部设备交换数据的操作都叫IO) 阻塞;

  4. 适合冷备份:文件精简,适合定时归档、异地备份。

缺点
  1. 存在数据丢失风险:两次快照之间的增量数据未落地,若进程宕机,会丢失上一次快照后的新数据;

  2. fork 耗时问题:大数据量(GB级)场景,fork 子进程会耗时较高,短暂阻塞主线程;

  3. 不适合高频持久化:频繁快照会大量消耗 CPU、磁盘 IO 资源。

四、AOF 持久化(日志持久化)

4.1 核心原理

AOF 是增量日志持久化 ,核心逻辑是:记录客户端所有写操作命令(增、删、改,忽略读命令),以追加的方式写入日志文件。

Redis 重启恢复数据时,会读取 AOF 日志中的命令,重新执行一遍,还原内存数据。AOF 是实时性更高的持久化方案,最大程度减少数据丢失。

4.2 AOF 核心执行流程

AOF 持久化分为三个核心步骤,全程不阻塞主进程:

  1. 命令追加 :客户端执行写命令后,Redis 将命令格式化、校验后,追加到AOF 内存缓冲区域,积累一段时间后再统一写入到磁盘。流程如下:

  2. 文件写入:根据配置的刷盘机制,将缓冲区数据写入磁盘 AOF 文件;

  3. 文件重写:AOF 日志会持续膨胀,Redis 会定期重写日志,达到精简文件,缩小文件体积的目的

4.3 AOF 三种刷盘配置

刷盘策略决定了数据写入磁盘的时机,直接影响数据安全性和性能

策略 配置值 执行逻辑 数据安全性 性能
每秒刷盘(默认) appendfsync everysec 缓冲区数据每秒统一刷盘一次 安全性高,最多丢失1秒内的数据 均衡,生产默认首选
实时刷盘 appendfsync always 每执行一条写命令,立即刷盘 最高,无数据丢失 极差,高频场景严重拖慢性能
系统自动刷盘 appendfsync no 交由操作系统决定刷盘时机 最低,但可能丢失大量数据 最高,几乎无性能损耗

4.4 AOF 日志重写机制

随着内存的数据量越来越多,AOF 文件会持续变大,但会存在大量冗余命令吗,比如多次修改同一个 key、重复删除无效 key,导致文件变大、重启恢复缓慢。为此 Redis 提供 了AOF 重写机制。重写流程如下:

重写核心逻辑

Redis fork 子进程,遍历当前内存所有数据(当前内存的数据就是最终的key的状态),生成新的AOF文件替换旧的冗余 AOF 文件,大幅压缩文件体积。

注意:redis7版本之后移除了父进程内存缓冲区,重写期间新增命令直接写入独立的增量AOF文件,不再写入缓冲区,同时也不需要一边重写一边持续追加旧的AOF文件。

重写机制的触发
4.5 AOF 数据恢复流程
  1. Redis 启动时检测 appendonly.aof 文件;

  2. 校验文件完整性,修复末尾不完整命令(支持兼容宕机残留的残缺日志);

  3. 逐行重放日志中的写命令,还原内存数据。

4.6 AOF 优缺点总结

优点
  1. 数据安全性极高:默认每秒刷盘,最多丢失1秒数据,可配置实时刷盘实现零丢失;

  2. 日志容错性强:支持修复残缺日志,宕机残留的不完整命令不会导致服务启动失败;

  3. 增量写入效率高:无需全量遍历数据,仅追加写命令,日常性能损耗低。

缺点
  1. 文件体积大:日志存储所有写命令,即使重写后,体积仍远大于 RDB 文件;

  2. 数据恢复慢:需要逐行重放命令,大数据量场景恢复效率远低于 RDB;

  3. 高频 IO 损耗:实时/每秒刷盘会持续消耗磁盘 IO,极端场景影响吞吐量。

五、RDB 与 AOF 核心对比(超全对照表)

对比维度 RDB AOF
持久化类型 全量快照 增量日志
数据丢失率 较高,丢失两次快照间增量数据 极低,最多丢失1秒数据
文件体积 小,二进制压缩文件 大,文本命令日志
恢复速度 极快 较慢
性能损耗 定时高损耗,日常低损耗 持续低IO损耗,稳定均衡
容错能力 差,文件损坏直接无法恢复 强,支持修复残缺日志
适用场景 冷备份、快速恢复、数据容忍少量丢失 核心业务、高数据一致性场景

六、Redis 混合持久化(生产最优方案)

6.1 混合持久化原理

AOF 重写时,先将当前全量内存数据以 RDB 二进制格式 写入新 AOF 文件头部,再将后续增量写命令以 AOF 日志格式追加在尾部。

既拥有 RDB 文件小、恢复快 的优点,又保留 AOF 数据安全性高、增量写入效率高的优势。

6.2 混合持久化配置

redis5.0以上版本默认开启,图中配置项为yes代表开启

6.3 混合持久化优势

  1. 解决纯 AOF 重启恢复慢的问题,头部 RDB 快照快速落地全量数据;

  2. 解决纯 RDB 数据丢失多的问题,尾部 AOF 日志补齐增量数据;

  3. 大幅精简 AOF 文件体积,减少磁盘占用。

七、总结

1、RDB 是全量快照,胜在体积小、恢复快、性能稳定,短板是存在增量数据丢失风险,适合冷备份、非核心业务;

2、AOF 是增量日志,胜在数据安全性高、容错性强,短板是文件体积大、恢复速度慢,适合核心业务;

3、混合持久化 是 Redis 生产最优方案,取长补短,平衡数据安全、恢复速度和性能;

相关推荐
muddjsv3 小时前
SQLite 外键进阶:CASCADE / SET NULL / 级联更新与完整性校验
数据库·sqlite
APItesterCris3 小时前
Open Claw 实战教程:5 分钟搭建京东商品自动化监控与数据分析系统
大数据·运维·数据库·数据仓库·自动化
Nturmoils4 小时前
查库存的 SQL 时灵时不灵,最后发现是 WHERE 里两个函数在打架
数据库
不想纳尼的青春4 小时前
where = 的作用?会影响性能吗?count(*) 和 count()哪个快?
数据库·oracle
倔强的石头_5 小时前
Spring Boot 接入金仓数据库:配置分层、启动自检与常见错误
数据库
黑桃小柒75 小时前
Django模型关系:从一对多到多对多全解析
数据库·django·sqlite
上海安当技术5 小时前
统一身份认证平台怎么落地?11 个异构业务系统接入 ASP 的完整实施路径
数据库·servlet·架构·kubernetes·jenkins
在水一缸6 小时前
PGSimCity:当数据库内核变成一座可以漫步的城市
数据库·postgresql·可视化·开源项目·数据库内核·pgsimcity·技术科普
jnrjian6 小时前
psql 执行多个 sql 文件
数据库·sql