Redis 持久化
Redis提供两种持久化方式:RDB和AOF,用于将内存中的数据保存到磁盘。
RDB(Redis Database)
什么是RDB?
RDB是Redis的快照持久化方式,在指定的时间间隔内生成数据集的时间点快照(snapshot)。
工作原理
- Redis调用fork()创建子进程
- 子进程将数据写入临时RDB文件
- 写入完成后,用新文件替换旧文件
主进程 子进程
│ │
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
# 查看最后一次保存时间
LASTSAVERDB的优缺点
优点:
- ✅ 文件紧凑,适合备份和灾难恢复
- ✅ 恢复速度快
- ✅ 对性能影响小(fork子进程)
缺点:
- ❌ 数据可能丢失(最后一次快照到宕机之间的数据)
- ❌ fork子进程时,如果数据量大,可能耗时较长
- ❌ 不适合实时持久化
AOF(Append Only File)
什么是AOF?
AOF以日志的形式记录每个写操作,恢复时重新执行这些命令来恢复数据。
工作原理
- 客户端执行写命令
- Redis将命令追加到AOF缓冲区
- 根据策略将缓冲区内容写入AOF文件
- 定期重写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
| 特性 | RDB | AOF |
|---|---|---|
| 文件大小 | 小 | 大 |
| 恢复速度 | 快 | 慢 |
| 数据安全性 | 低(可能丢失分钟级数据) | 高(最多丢失1秒数据) |
| 对性能影响 | 小 | 大 |
| 文件可读性 | 二进制,不可读 | 文本,可读 |
混合持久化(推荐)
Redis 4.0+ 支持RDB和AOF混合持久化。
工作原理
在AOF重写时:
- 将当前数据以RDB格式写入AOF文件开头
- 后续的写命令以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 "" # 禁用RDBRDB + 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文档,欢迎补充更多持久化相关内容。