ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Redis的持久化RDB、AOF 精讲

2026/8/2 10:33:38 拓冰建站 浏览量
Redis的持久化RDB、AOF 精讲

Redis的持久化方式

           Redis 提供两种持久化方式

        1.RDB(Redis Database Backup) 

        Redis RDB(Redis Database Backup)是一种快照持久化机制,它会在指定的时间点将 Redis 数据库的状态保存到一个二进制文件中。RDB 文件是某个时间点的数据快照,适合用于灾难恢复和备份。

1.1RDB 快照的生成

RDB 文件可以通过以下几种方式生成:

  1. save 命令:手动执行 save 命令会阻塞 Redis 主进程,直到 RDB 文件创建完成。这意味着在 save 执行期间,Redis 不能处理其他客户端请求。

  2. bgsave 命令:手动或通过配置规则自动触发 bgsave 命令,Redis 会 fork 出一个子进程来创建 RDB 文件,主进程可以继续处理客户端请求,因此对性能影响较小。

1.2 Fork子进程的优缺点

因为会Fork出一个子进程来生成RDB文件并且子进程和主进程的页表指向的物理内存都是同一块区域,此时主进程产生修改原来缓存的内容,就不能直接修改页表对应的物理内存地址中的内容,而是需要写时复制  来解决,在修改原来的内容时 会复制一块一模一样的副本,且原来页表指向新的副本进行修改,而不会直接去修改原来的物理块 

!但是写时复制是把双刃剑,在极端情况下 在进行RDB快照生成时,缓存中所有的数据都被修改,那么内存占用将会达到双倍

1.2 自动触发规则

根据 redis.conf 中配置的规则自动触发 bgsave。例如:

save 900 1
save 300 10
save 60 10000

这些配置项表示,在 900 秒内至少有 1 个键发生变化、300 秒内至少有 10 个键发生变化、或者 60 秒内至少有 10000 个键发生变化时,自动触发一次 RDB 持久化。

         2.AOF(Append Only File)

       2.1 什么是AOF 

       AOF(Append Only File) 是 Redis 提供的另一种持久化方式。与 RDB 不同,AOF 持久化记录的是客户端对数据库执行的所有写操作命令(如 SET, DEL, HSET 等),以 Redis 客户端请求协议的格式追加到一个日志文件中。

简单来说:

AOF 文件是一个只追加的日志文件,保存了所有改变 Redis 数据的写命令。


        2.2 怎么开启AOF          

        ⚠️ AOF 持久化配置默认是关闭的,所以需要手动打开。打开后就可以写入持久化文件 appendonly.aof 中

    appendonly yes
    

    2.3 AOF 的工作流程

    1. 命令写入缓冲区
      • Redis 主进程在处理完写命令后,会将该命令追加到内存中的 AOF 缓冲区(aof_buf)。
    2. 根据策略刷盘
      • Redis 根据配置项 appendfsync 决定何时将缓冲区内容写入磁盘。
    3. 异步重写(AOF Rewrite)
      • 随着时间推移,AOF 文件可能变得冗余庞大(比如多次修改同一个 key),Redis 可以通过 BGREWRITEAOF 命令进行 AOF 文件重写,压缩其大小并优化结构。

     2.4 AOF 的三种同步策略(appendfsync)

    配置项行为数据安全性性能
    always每次写命令都同步刷盘(调用 fsync✅ 最高(最多丢 1 条命令)❌ 最低
    everysec每秒批量刷盘一次(默认)✅ 较高(最多丢 1 秒数据)✅ 平衡
    no由操作系统决定何时刷盘(通常每 30 秒)❌ 最低(可能丢失较多数据)✅ 最高

    2.5 AOF 重写(Rewrite)机制

    2.5.1 为什么需要 AOF 重写?

    随着 Redis 的运行,AOF 文件可能会变得非常大,例如:

    • 对同一个 key 多次赋值(如 SET key 1 → SET key 2 → SET key 3),重写后就会只记录 SET key 3 这一个记录
    • 执行了很多删除操作(这些操作不会被自动清理)

    为了减少 AOF 文件体积并提高恢复效率,Redis 提供了 AOF 重写功能

    2.5.2 如何触发?
    • 手动触发:发送命令 BGREWRITEAOF
    • 自动触发:通过配置项控制,如:
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb

    📌 配置详解

    1. auto-aof-rewrite-percentage 100

    • 含义:表示当前 AOF 文件大小相对于上一次重写后的 AOF 文件大小的增长百分比。
    • 默认值为 100 表示:

      当前 AOF 文件大小超过上一次重写后文件大小的 100%(即翻倍) 时,Redis 将考虑触发一次自动 AOF 重写。

    📌 举例说明

    • 上次重写后的 AOF 文件大小是 64MB;
    • 当前 AOF 文件大小达到 128MB(64MB × 2),就会满足这个条件。

    2. auto-aof-rewrite-min-size 64mb

    • 含义:表示触发 AOF 重写的最小文件大小。
    • 默认值为 64MB 表示:

      只有当 AOF 文件大小 大于等于 64MB 时,才允许根据增长比例来判断是否触发重写。

    📌 作用:防止 Redis 在 AOF 文件还很小的时候就频繁进行重写,浪费资源。

    2.5.3 工作原理:
    1. Redis 主进程 fork 出一个子进程。
    2. 子进程读取当前数据库的数据,并将其转换为最小化的等效命令集合(如只保留最终值)。
    3. 新的 AOF 文件生成后,替换旧的 AOF 文件(原子操作)。

    ⚠️ AOF 重写期间主进程仍然接收写请求,这些新命令会被缓存并在重写完成后追加到新 AOF 文件中。