一、两种持久化方式概述
RDB(Redis Database)
基于时间点的快照,将内存数据保存到磁盘的二进制文件
AOF(Append Only File)
基于操作日志,记录所有写操作命令,重启时重新执行这些命令
二、详细对比表
| 特性维度 | RDB | AOF |
|---|---|---|
| 持久化机制 | 定时生成数据快照 | 记录每一条写操作命令 |
| 文件格式 | 二进制压缩格式(紧凑) | 文本格式(可读性强) |
| 文件大小 | 较小(压缩存储) | 较大(命令积累) |
| 恢复速度 | 快(直接加载二进制) | 慢(需重放所有命令) |
| 数据安全性 | 较低(可能丢失最后一次快照后的数据) | 高(fsync策略决定) |
| 性能影响 | 子进程fork时有内存开销,主进程几乎不受影响 | 根据fsync策略有不同程度的I/O开销 |
| 使用场景 | 数据备份、灾难恢复、快速重启 | 要求数据完整性、可容忍一定性能损失 |
| 版本兼容 | 较差(不同版本RDB格式可能不兼容) | 较好(命令格式基本兼容) |
| 资源消耗 | CPU和内存(fork时) | 磁盘I/O(写AOF文件时) |
三、RDB详细机制
触发方式
redis
复制
下载
# 配置文件设置(redis.conf)
save 900 1 # 900秒内至少1个key变化
save 300 10 # 300秒内至少10个key变化
save 60 10000 # 60秒内至少10000个key变化
# 手动命令
SAVE # 同步保存,阻塞其他命令
BGSAVE # 后台异步保存
优点
-
性能高:fork子进程处理,主进程继续服务
-
文件紧凑:适合备份和传输
-
恢复快:大数据集恢复速度明显优于AOF
缺点
-
数据丢失风险:两次快照间的数据可能丢失
-
fork开销:大数据集时fork可能耗时较长
-
版本兼容问题:不同版本间RDB格式可能不兼容
四、AOF详细机制
写回策略(appendfsync)
redis
复制
下载
# redis.conf配置
appendfsync always # 每个写命令都同步(最安全,性能最低)
appendfsync everysec # 每秒同步一次(推荐,平衡点)
appendfsync no # 由操作系统决定(性能最好,安全性最低)
AOF重写机制
redis
复制
下载
# 触发条件
auto-aof-rewrite-percentage 100 # 当前AOF文件比上次重写后大100%
auto-aof-rewrite-min-size 64mb # AOF文件至少64MB才重写
# 手动触发
BGREWRITEAOF
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案
【点击此处即可/免费获取】
优点
-
数据安全:可配置不同的同步策略
-
可读性强:AOF文件为文本格式,便于分析
-
容错性好 :AOF损坏时可用
redis-check-aof工具修复 -
实时性高:记录每条写命令
缺点
-
文件体积大:即使重写后仍可能比RDB大
-
恢复速度慢:大数据集时重放命令耗时
-
性能影响:根据fsync策略可能影响吞吐量
-
存在Bug风险:早期版本AOF重写有Bug风险
五、混合持久化(Redis 4.0+)
机制
redis
复制
下载
# 启用混合持久化
aof-use-rdb-preamble yes
工作原理
-
AOF文件结构:RDB格式全量数据 + AOF格式增量命令
-
重写过程:BGREWRITEAOF生成新的RDB格式头,再追加期间的AOF命令
-
加载过程:先加载RDB部分,再执行AOF命令
优点
-
结合两者优势:快速加载 + 数据安全
-
AOF文件更紧凑
-
恢复速度比纯AOF快
六、配置建议
生产环境推荐配置
redis
复制
下载
# RDB配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
# AOF配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 混合持久化(Redis 4.0+)
aof-use-rdb-preamble yes
不同场景选择
场景1:数据安全优先
redis
复制
下载
appendonly yes
appendfsync always # 或 everysec
aof-use-rdb-preamble yes # Redis 4.0+
save "" # 禁用RDB或保持RDB作为备份
场景2:性能优先
redis
复制
下载
appendonly no # 禁用AOF
save 900 1
save 300 10
save 60 10000
场景3:兼顾安全与性能(推荐)
redis
复制
下载
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
save 3600 1 # 每小时备份一次
save 300 100
save 60 10000
七、监控与维护
关键监控指标
bash
复制
下载
# 查看持久化信息
redis-cli info persistence
# 重要指标
rdb_last_save_time # 上次RDB保存时间
rdb_changes_since_last_save # 上次保存后的变更数
aof_enabled # AOF是否启用
aof_last_rewrite_time_sec # 上次AOF重写耗时
aof_current_size # 当前AOF文件大小
aof_base_size # 上次重写时的AOF大小
常见问题处理
1. RDB生成失败
-
原因:内存不足、磁盘满、权限问题
-
解决:监控内存和磁盘,确保目录可写
2. AOF文件过大
bash
复制
下载
# 手动触发重写
redis-cli BGREWRITEAOF
# 检查AOF文件
redis-check-aof --fix appendonly.aof
3. 恢复数据
bash
复制
下载
# 优先使用AOF恢复(如果存在)
# 或指定RDB文件恢复
redis-server --dbfilename dump.rdb --dir /data/redis
八、性能优化建议
RDB优化
-
避免大数据集频繁保存:调整save参数
-
使用BGSAVE而非SAVE
-
确保足够内存:fork时需要双倍内存
-
磁盘性能:使用SSD提高写入速度
AOF优化
-
使用everysec策略:平衡性能与安全
-
AOF重写时机:避开业务高峰
-
no-appendfsync-on-rewrite yes:重写期间不fsync
-
使用混合持久化:减少AOF文件大小
通用优化
-
分离持久化目录:与数据目录分开
-
监控fork时间:info stats查看latest_fork_usec
-
定期备份:将RDB/AOF文件备份到远程
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案
【点击此处即可/免费获取】
九、灾难恢复方案
备份策略
bash
复制
下载
# 1. 定时备份脚本
#!/bin/bash
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
redis-cli SAVE
cp /var/lib/redis/dump.rdb ${BACKUP_DIR}/dump_${DATE}.rdb
# 保留最近7天备份
find ${BACKUP_DIR} -name "*.rdb" -mtime +7 -delete
# 2. AOF和RDB同时备份
恢复优先级
-
AOF文件完好 → 使用AOF恢复
-
AOF损坏但RDB完好 → 使用RDB恢复
-
两者都损坏 → 从备份恢复
-
无备份 → 尝试修复AOF:
redis-check-aof --fix
十、版本演进差异
| Redis版本 | 重要改进 |
|---|---|
| 2.4+ | AOF重写优化,避免使用临时文件 |
| 2.6+ | AOF每秒fsync成为默认选项 |
| 3.2+ | AOF重写更快,RDB格式优化 |
| 4.0+ | 混合持久化、RDB-AOF混合格式 |
| 5.0+ | RDB文件格式优化,更快的加载速度 |
| 6.0+ | 多线程I/O,提升AOF重写性能 |
| 7.0+ | 多部分AOF文件,更好的持久化管理 |
总结建议
选择原则
-
数据安全第一 :金融、交易类系统 → AOF(everysec)+ 混合持久化
-
性能优先 :缓存、会话存储 → RDB
-
平衡方案 :大多数业务场景 → RDB + AOF(混合持久化)
最佳实践
-
永远备份:定期将RDB/AOF备份到异地
-
监控告警:监控持久化状态和失败情况
-
容量规划:为持久化预留足够磁盘空间
-
测试恢复:定期测试备份文件的恢复流程
-
版本管理:升级时注意RDB格式兼容性
最终推荐配置(生产环境)
redis
复制
下载
# 启用两种方式
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
# 其他优化
rdbcompression yes
rdbchecksum yes
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
dir /data/redis/persistence