Skip to content

Redis 持久化

Redis提供两种持久化方式:RDB和AOF,用于将内存中的数据保存到磁盘。

RDB(Redis Database)

什么是RDB?

RDB是Redis的快照持久化方式,在指定的时间间隔内生成数据集的时间点快照(snapshot)。

工作原理

  1. Redis调用fork()创建子进程
  2. 子进程将数据写入临时RDB文件
  3. 写入完成后,用新文件替换旧文件
   主进程                子进程
      │                    │
   fork() ────────────────>│
      │                    │ 写RDB文件
   继续处理请求            │
      │                    │ 写入完成
      │<────────────────── │
   替换旧RDB文件

配置RDB

conf
# 保存策略:save <seconds> <changes>
save 900 1      # 900秒内至少1个键改变
save 300 10     # 300秒内至少10个键改变
save 60 10000   # 60秒内至少10000个键改变

# RDB文件名
dbfilename dump.rdb

# 数据目录
dir /var/lib/redis

# RDB压缩
rdbcompression yes

# RDB校验
rdbchecksum yes

# 后台保存失败时停止写入
stop-writes-on-bgsave-error yes

手动触发RDB

redis
# SAVE:阻塞保存(不推荐)
SAVE

# BGSAVE:后台保存(推荐)
BGSAVE

# 查看最后一次保存时间
LASTSAVE

RDB的优缺点

优点

  • ✅ 文件紧凑,适合备份和灾难恢复
  • ✅ 恢复速度快
  • ✅ 对性能影响小(fork子进程)

缺点

  • ❌ 数据可能丢失(最后一次快照到宕机之间的数据)
  • ❌ fork子进程时,如果数据量大,可能耗时较长
  • ❌ 不适合实时持久化

AOF(Append Only File)

什么是AOF?

AOF以日志的形式记录每个写操作,恢复时重新执行这些命令来恢复数据。

工作原理

  1. 客户端执行写命令
  2. Redis将命令追加到AOF缓冲区
  3. 根据策略将缓冲区内容写入AOF文件
  4. 定期重写AOF文件以压缩体积
客户端命令 → AOF缓冲区 → AOF文件

          fsync策略

配置AOF

conf
# 开启AOF
appendonly yes

# AOF文件名
appendfilename "appendonly.aof"

# 同步策略
appendfsync everysec  # 每秒同步(推荐)
# appendfsync always  # 每次写入同步(最安全,性能最差)
# appendfsync no      # 由操作系统决定(性能最好,可能丢失较多数据)

# AOF重写触发条件
auto-aof-rewrite-percentage 100  # 文件大小增长100%时重写
auto-aof-rewrite-min-size 64mb   # 文件至少64MB才重写

# 加载AOF时忽略最后一条可能不完整的命令
aof-load-truncated yes

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

同步策略对比

策略性能安全性数据丢失
always最高最多丢失1条命令
everysec较高最多丢失1秒数据
no最好可能丢失数十秒数据

推荐使用 everysec:平衡性能和安全性。

AOF重写

AOF文件会越来越大,Redis提供重写机制压缩文件。

重写原理

  • 不读取旧AOF文件
  • 直接从内存中读取当前数据
  • 生成新的AOF文件
redis
# 手动触发重写
BGREWRITEAOF

# 查看重写状态
INFO persistence

重写示例

# 原始AOF(100条命令)
SET key "value1"
SET key "value2"
SET key "value3"
...

# 重写后(1条命令)
SET key "value3"

AOF的优缺点

优点

  • ✅ 数据更安全,最多丢失1秒数据
  • ✅ AOF文件是追加写入,不易损坏
  • ✅ AOF文件可读性好,易于分析和修复

缺点

  • ❌ AOF文件通常比RDB文件大
  • ❌ 恢复速度比RDB慢
  • ❌ 对性能影响较大(频繁写操作)

RDB vs AOF

特性RDBAOF
文件大小
恢复速度
数据安全性低(可能丢失分钟级数据)高(最多丢失1秒数据)
对性能影响
文件可读性二进制,不可读文本,可读

混合持久化(推荐)

Redis 4.0+ 支持RDB和AOF混合持久化。

工作原理

在AOF重写时:

  1. 将当前数据以RDB格式写入AOF文件开头
  2. 后续的写命令以AOF格式追加
[RDB数据] + [AOF增量命令]

配置

conf
# 开启混合持久化
aof-use-rdb-preamble yes

优点

  • ✅ 结合RDB和AOF的优点
  • ✅ 文件较小(RDB部分压缩)
  • ✅ 恢复速度快(RDB部分快速加载)
  • ✅ 数据安全(AOF增量保证)

持久化策略选择

只使用RDB

适合场景:

  • 可以容忍分钟级数据丢失
  • 追求极致性能
  • 数据可以从其他地方恢复
conf
save 900 1
save 300 10
save 60 10000
appendonly no

只使用AOF

适合场景:

  • 对数据安全性要求高
  • 不能容忍数据丢失
conf
appendonly yes
appendfsync everysec
save ""  # 禁用RDB

RDB + AOF(推荐)

适合场景:

  • 生产环境
  • 需要高可用和数据安全
conf
# RDB配置
save 900 1
save 300 10
save 60 10000

# AOF配置
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes

不使用持久化

适合场景:

  • 纯缓存使用
  • 数据可以随时丢失
conf
save ""
appendonly no

持久化实战

备份恢复

bash
# 1. 备份RDB文件
cp /var/lib/redis/dump.rdb /backup/dump.rdb.bak

# 2. 恢复数据
redis-cli SHUTDOWN
cp /backup/dump.rdb.bak /var/lib/redis/dump.rdb
redis-server

# 3. 备份AOF文件
cp /var/lib/redis/appendonly.aof /backup/appendonly.aof.bak

查看持久化状态

redis
# 查看持久化信息
INFO persistence

# 关键指标
# rdb_last_save_time: 最后一次RDB保存时间
# rdb_changes_since_last_save: 自上次保存后的改变数
# aof_current_size: 当前AOF文件大小
# aof_base_size: 上次重写后的大小

性能优化

conf
# 1. 使用混合持久化
aof-use-rdb-preamble yes

# 2. 合理设置重写阈值
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 3. 使用everysec策略
appendfsync everysec

# 4. 避免同时进行RDB和AOF重写
no-appendfsync-on-rewrite yes

故障恢复

bash
# 1. AOF文件损坏修复
redis-check-aof --fix appendonly.aof

# 2. RDB文件检查
redis-check-rdb dump.rdb

# 3. 如果AOF损坏严重,使用RDB恢复
# 关闭AOF,使用RDB启动,然后重新开启AOF

监控持久化

关键指标

redis
INFO persistence

# 监控指标
# - rdb_last_save_time:RDB保存时间
# - rdb_last_bgsave_status:RDB保存状态
# - aof_enabled:AOF是否启用
# - aof_last_rewrite_time_sec:上次重写耗时
# - aof_last_bgrewrite_status:重写状态

告警规则

  • RDB保存失败
  • AOF重写失败
  • AOF文件过大
  • 持久化耗时过长

💡 提示

这是一个demo文档,欢迎补充更多持久化相关内容。

相关链接

基于 VitePress 构建