首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Redis-数据持久化(AOF)

Redis-数据持久化(AOF)

作者头像
运维小路
发布2026-02-03 14:39:41
发布2026-02-03 14:39:41
630
举报
文章被收录于专栏:运维小路运维小路

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL

PostgreSQL

MongoDB

Redis(本章节)

Etcd

上个小节我们介绍了RBD的持久化方式,这个小节我们就来介绍AOF持久化。

一、AOF 基本概念

1.1 什么是AOF

AOF(Append Only File)通过记录所有写操作命令的方式实现持久化。与RDB的快照方式不同,AOF记录的是操作历史,类似于数据库的WAL(Write-Ahead Logging)。

1.2 核心特点

  • 日志追加模式:所有写命令追加到文件末尾
  • 可读性强:文件为文本格式,可人工查看和修改
  • 数据安全度高:支持多种同步策略,最多丢失1秒数据
  • 文件体积大:随着时间增长,AOF文件会越来越大

二、AOF 工作流程

代码语言:javascript
复制
客户端写请求
    │
    ├─ 执行命令
    │   │
    │   └─ 写入AOF缓冲区
    │       │
    │       ├─ 策略1:每次写入都同步到磁盘(appendfsync always)
    │       │
    │       ├─ 策略2:每秒同步一次(appendfsync everysec)← 默认
    │       │
    │       └─ 策略3:由操作系统决定(appendfsync no)
    │
    └─ 返回客户端

三、AOF 配置详解

代码语言:javascript
复制
# redis.conf

# 开启AOF持久化
appendonly yes

# AOF文件名
appendfilename "appendonly.aof"

# AOF文件存储目录(与RDB相同)
dir ./

# 同步策略
appendfsync everysec  # 推荐配置

# AOF重写期间是否禁止同步
no-appendfsync-on-rewrite no

# 自动触发重写条件
auto-aof-rewrite-percentage 100  # 当前AOF文件大小超过上次重写大小的100%
auto-aof-rewrite-min-size 64mb   # AOF文件最小重写大小

# 加载AOF时遇到错误处理
aof-load-truncated yes

# 开启混合持久化(Redis 4.0+)
aof-use-rdb-preamble yes

3.2 三种同步策略对比

策略

命令执行后的操作

数据安全性

性能影响

适用场景

always

立即同步到磁盘

最高(不丢失数据)

最差(每次写都fsync)

金融、交易等对数据一致性要求极高的场景

everysec

每秒同步一次

高(最多丢失1秒数据)

适中(折中方案)

生产环境推荐,兼顾性能和数据安全

no

由操作系统决定(通常30秒)

低(可能丢失较多数据)

最好

可容忍数据丢失的非关键业务

四、AOF 重写机制

4.1 为什么需要重写?

AOF文件会随着时间增长而变大,其中包含大量冗余命令(如多次set同一个key),重写可以:

  1. 压缩文件体积
  2. 提高恢复速度
  3. 删除过期数据

4.2 重写过程

代码语言:javascript
复制
# 手动触发重写
redis-cli BGREWRITEAOF

# 自动重写触发条件(默认配置):
# 当前AOF文件大小 > 上次重写后大小的2倍
# 且AOF文件大小 > 64MB

4.3 重写流程图解

代码语言:javascript
复制
主进程
   │
   ├─ 检查重写条件
   │
   ├─ fork()创建子进程
   │     │
   │    子进程
   │     ├─ 读取内存当前数据状态
   │     ├─ 生成新的AOF临时文件
   │     └─ 替换旧AOF文件
   │
   ├─ 继续接收写命令
   │  写入AOF缓冲区
   │  写入AOF重写缓冲区 ← 关键!
   │
   └─ 子进程完成后,主进程将重写缓冲区内容追加到新AOF文件

五、AOF 数据恢复

5.1 恢复过程

代码语言:javascript
复制
# Redis启动时自动执行:
1. 检查是否存在AOF文件
2. 如果存在,按顺序重放所有写命令
3. 重建内存数据库

5.2 恢复完整性保证

代码语言:javascript
复制
# 开启AOF文件校验
aof-load-truncated yes

# Redis会:
# 1. 检查AOF文件末尾是否完整
# 2. 如果文件损坏,会尝试截取完整部分加载
# 3. 如果aof-load-truncated=no,则拒绝启动

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

6.1 混合持久化原理

代码语言:javascript
复制
# 开启混合持久化
aof-use-rdb-preamble yes

文件格式:

代码语言:javascript
复制
[前部分:RDB格式的全量数据]
[后部分:AOF格式的增量命令]

6.2 优势

  1. 快速恢复:RDB格式加载快
  2. 数据安全:AOF保证增量数据不丢失
  3. 兼容性好:旧版本Redis可读取RDB部分
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB
  • 一、AOF 基本概念
    • 1.1 什么是AOF
    • 1.2 核心特点
  • 二、AOF 工作流程
  • 三、AOF 配置详解
    • 3.2 三种同步策略对比
  • 四、AOF 重写机制
    • 4.1 为什么需要重写?
    • 4.2 重写过程
    • 4.3 重写流程图解
  • 五、AOF 数据恢复
    • 5.1 恢复过程
    • 5.2 恢复完整性保证
  • 六、混合持久化(Redis 4.0+)
    • 6.1 混合持久化原理
    • 6.2 优势
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档