Redis 持久化机制深度解析(RDB / AOF / 混合持久化)

Redis 持久化机制深度解析(RDB / AOF / 混合持久化)

作者:心之伊始

适合读者:后端工程师 / 架构师 / 对 Redis 稳定性与数据安全有要求的技术人员


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

Redis 是内存数据库,其核心优势是:

  • 极致的读写性能(QPS 可达百万级)
  • 简单高效的数据结构

但内存有一个致命问题:

进程一旦退出,数据全部丢失

典型异常场景包括:

  • Redis 进程 crash
  • 服务器宕机 / 掉电
  • 容器重启 / Pod 重建
  • 人为误操作(kill -9)

持久化的目标:

在性能、数据安全、恢复速度之间找到平衡点。


二、Redis 持久化的整体设计

Redis 提供了三种持久化方案:

方案 全称 核心思想
RDB Redis DataBase 定期生成内存快照
AOF Append Only File 记录每一条写命令
混合持久化 RDB + AOF 启动时用 RDB,运行时用 AOF

整体架构示意

复制代码
            ┌──────────────┐
            │   Client     │
            └──────┬───────┘
                   │ write
                   ▼
            ┌──────────────┐
            │    Redis     │
            │   (Memory)   │
            └───┬────┬─────┘
                │    │
        RDB 快照│    │AOF 日志
                ▼    ▼
          dump.rdb  appendonly.aof

三、RDB 持久化:内存快照机制

3.1 RDB 是什么?

RDB 是 某一时刻 Redis 内存数据的全量快照 ,生成一个 dump.rdb 文件。

一句话理解:

给 Redis 的内存拍一张"全家福"。


3.2 RDB 触发方式

1️⃣ 手动触发
bash 复制代码
SAVE        # 同步阻塞(不推荐)
BGSAVE      # 异步(推荐)
2️⃣ 自动触发(最常用)
conf 复制代码
save 900 1     # 900 秒内有 1 次写
save 300 10
save 60 10000
3️⃣ 主从复制触发
  • slave 第一次全量同步
  • 会触发主节点 BGSAVE

3.3 RDB 的底层实现(重点)

BGSAVE 的核心流程
复制代码
主进程 (Redis)
   │
   ├─ fork() ──────────────┐
   │                       │
父进程                  子进程
继续处理请求        遍历内存数据
                         ↓
                    生成 dump.rdb
关键技术点:Copy-On-Write(COW)
  • fork 后父子进程共享内存页

  • 只有当父进程发生写操作时:

    • 操作系统才会复制对应内存页

优点:

  • 不阻塞 Redis 主线程
  • 最大化复用内存

隐患:

  • 写入密集场景下,内存瞬间翻倍

3.4 RDB 的优缺点

✅ 优点
  • 文件紧凑,恢复速度极快

  • 非常适合:

    • 冷备份
    • 全量恢复
    • 主从复制
❌ 缺点
  • 数据可能丢失(分钟级)
  • fork + COW 对内存压力大

四、AOF 持久化:操作日志机制

4.1 AOF 是什么?

AOF 以日志的形式记录所有写命令

复制代码
SET user:1 Tom
INCR order_id
DEL cache:key

Redis 重启时:

重新"回放"这些命令,恢复数据。


4.2 AOF 写入流程(非常重要)

复制代码
Client write
   │
   ▼
Redis 执行命令
   │
   ▼
写入 AOF 缓冲区
   │
   ▼
根据策略刷盘

4.3 AOF 刷盘策略

conf 复制代码
appendonly yes
appendfsync always
策略 行为 数据安全 性能
always 每条命令 fsync ★★★★★
everysec(默认) 每秒 fsync ★★★★ ★★★★
no OS 控制 ★★★★★

👉 生产环境推荐:everysec


4.4 AOF 重写(Rewrite)机制

问题:

AOF 文件会无限增长:

复制代码
INCR a
INCR a
INCR a
...
解决方案:AOF Rewrite
复制代码
INCR a (10000 次)
↓
SET a 10000
重写流程
复制代码
主进程 fork 子进程
   │
   ├─ 子进程生成新 AOF(基于内存)
   │
   ├─ 主进程写入 rewrite buffer
   │
   ▼
合并 rewrite buffer
替换旧 AOF 文件

⚠️ 整个过程无阻塞主线程


4.5 AOF 的优缺点

✅ 优点
  • 数据更安全(秒级)
  • 可读性强(文本命令)
❌ 缺点
  • 文件体积大
  • 恢复速度慢

五、混合持久化(Redis 4.0+)

5.1 混合持久化是什么?

AOF Rewrite 时:前半段是 RDB,后半段是 AOF

conf 复制代码
aof-use-rdb-preamble yes

5.2 文件结构示意

复制代码
| RDB Snapshot | AOF Increment Commands |

5.3 优势

  • 启动速度接近 RDB
  • 数据安全性接近 AOF

👉 目前生产环境的最优解


六、生产环境选型建议(经验总结)

场景 推荐方案
缓存型数据 RDB
金融 / 订单 AOF everysec + 混合
大内存实例 混合持久化
高写入 避免频繁 BGSAVE

推荐配置模板

conf 复制代码
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
save 900 1
save 300 10
save 60 10000

七、Java 技术专家视角的几个常见误区

误区 1:Redis 开了持久化就不会丢数据

→ everysec 仍然可能丢 1 秒

误区 2:RDB 对性能没影响

→ fork + COW 是隐形炸弹

误区 3:AOF 一定比 RDB 安全

→ no fsync ≈ 不持久化


八、总结一句话

Redis 持久化,本质是:在性能、数据安全、恢复速度之间做工程权衡。

相关推荐
黄焖鸡能干四碗21 小时前
固定资产管理系统建设方案和源码(Java源码)
大数据·数据库·人工智能·物联网·区块链
JoneBB1 天前
ABAP Webservice连接
运维·开发语言·数据库·学习
解决问题no解决代码问题1 天前
从乱码到脱敏导出:TiDB CSV 导出实战全指南
数据库
未若君雅裁1 天前
MySQL高可用与扩展-主从复制读写分离分库分表
java·数据库·mysql
2401_867623981 天前
CSS Flex布局中如何设置子元素间距_掌握gap属性的现代用法
jvm·数据库·python
月落归舟1 天前
一篇文章了解Redis内存淘汰机制与过期Key清理
数据库·redis·mybatis
phltxy1 天前
Redis 事务
数据库·redis·缓存
康乾隆1 天前
SQL Server Always On 重新添加从库步骤
数据库·sqlserver
环流_1 天前
redis核心数据类型在java中的操作
java·数据库·redis
雨辰AI1 天前
SpringBoot3 项目国产化改造完整流程|从 MySQL 到人大金仓落地
java·数据库·后端·mysql·政务