Redis的持久化

Redis的持久化

一共分为三种,实际上就是两种,分别是RDB(Redis Database)快照AOF(Append Only File)文件追加以及4.0以后支持的混合持久化

RDB 实现原理

  • 触发方式:用户手动执行 SAVE(阻塞主进程)或 BGSAVE(后台异步),也可以配置 save m n(m 秒内 n 次修改自动触发)。
  • 执行流程

1. Redis 主进程 fork 出一个子进程,利用操作系统的写时复制(Copy-On-Write)技术,此时父子进程共享同一内存页。

2. 子进程遍历整个内存数据集,将其序列化为二进制格式,写入一个临时 RDB 文件。

3. 写入完成后,原子地替换旧的 RDB 文件(dump.rdb),子进程退出。

4. 在此期间,主进程继续处理写请求,若修改了某个内存页,系统会先复制该页供子进程使用,保证快照一致性。

### 优点

  • 文件紧凑:二进制压缩存储,特别适合备份、灾难恢复和跨数据中心复制。
  • 恢复速度快:直接载入内存,远快于 AOF 重放命令。
  • 对主进程性能影响小:主进程不参与磁盘 I/O,fork 子进程异步完成保存。

### 缺点

  • 数据丢失风险较高:只能恢复到最后一次快照的时间点,掉电或崩溃可能丢失几分钟甚至更久的数据(取决于快照间隔)。
  • fork 开销:内存数据集较大时,fork 操作本身耗时(可能阻塞主进程毫秒至秒级);且写时复制期间,若大量写请求发生,会导致内存翻倍,可能引发 OOM。

AOF 实现原理

  • 记录方式:每一条写命令被追加写入 AOF 缓冲区,然后根据配置策略同步到磁盘。
  • 同步策略(appendfsync
  • always:每条命令立即 fsync,最安全但性能最低。
  • everysec:每秒 fsync 一次,潜在丢失 1 秒数据(默认,推荐)。
  • no:由操作系统决定何时刷新,不安全。
  • AOF 重写(Rewrite):随着运行,AOF 文件不断膨胀。Redis 会触发 AOF 重写:

1. fork 子进程,利用写时复制读取当前内存数据,生成一份新的 AOF 文件(命令被压缩,如多条 incr key 合并为 set key 终值)。

2. 重写期间的新写命令同时追加到旧 AOF 缓冲区重写缓冲区

3. 子进程完成后,主进程将重写缓冲区中的剩余命令追加到新文件,并原子替换旧 AOF 文件。

### 优点

  • 数据安全性高everysec 策略下最多丢失 1 秒数据;若采用 always 几乎不丢数据。
  • 易于理解和修复:AOF 文件以 RESPor 文本协议保存,可直接查看,若文件损坏也能用 redis-check-aof 修复。
  • 自动压缩:rewrite 机制可缩小 AOF 文件体积。

### 缺点

  • 文件通常比 RDB 大:同样数据集,AOF 体积一般大于 RDB。
  • 恢复速度慢:通过重放命令重建数据,大量操作时耗时长于 RDB。
  • 性能影响always 策略会严重降低写吞吐;everysec 也会有微小性能开销。
  • 写入放大:AOF 重写期间可能产生额外磁盘负载。

## 混合持久化(RDB-AOF 混合模式,Redis 4.0+)

### 实现原理

  • 本质是对 AOF 的增强,在 AOF 重写时,不再单纯生成命令文件:

1. fork 子进程后,子进程先将当前内存数据以 RDB 二进制格式 写入新的 AOF 文件开头。

2. 接着将重写缓冲区中的增量命令以 AOF 格式 追加到文件尾部。

3. 替换旧 AOF 文件后,得到一份“头部是 RDB、尾部是 AOF”的混合文件。

  • 使用时必须开启 AOF(appendonly yes),并打开混合持久化开关(aof-use-rdb-preamble yes)。

### 优点

  • 兼具两者优点:恢复时大部分数据用 RDB 快速载入,尾部少量 AOF 命令保证最新写入不丢失,重启速度快且数据安全。
  • 文件体积:优于纯 AOF(头部 RDB 压缩率高),接近 RDB 水平。

### 缺点

  • 兼容性:生成的文件格式不能用于低于 4.0 版本的 Redis。
  • 可读性下降:文件头部为二进制 RDB 格式,无法像纯 AOF 一样直接查看所有内容。
  • 仍是 AOF 体系:仍需开启 AOF,具备 AOF 的某些固有开销(如 fsync 策略、rewrite 引起的负载)。

| 方式 | 数据安全性 | 恢复速度 | 文件体积 | 对性能影响 | 适用场景 |

| :--------- | :------------------- | :------- | :------- | :--------- | :---------------------------- |

| RDB | 较低(易丢较多数据) | 极快 | 小 | 轻 | 备份、灾难恢复,容忍数据丢失 |

| AOF | 高(至多丢1秒) | 慢 | 大 | 中等 | 对数据完整性要求高的场景 |

| 混合持久化 | 高 | 快 | 较小 | 中等 | Redis 4.0+ 推荐的生产环境首选 |

posted @ 2026-05-06 14:05  xzlrf  阅读(38)  评论(0)    收藏  举报