Redis 持久化
Redis数据存储在内存中,持久化可以将数据保存到磁盘。本课学习RDB和AOF两种持久化方式。
为什么需要持久化?
Redis是内存数据库,数据存储在内存中:
- 问题:服务器重启或崩溃,内存数据丢失
- 解决:持久化将内存数据保存到磁盘,重启后恢复数据
内存数据 → 持久化 → 磁盘文件
磁盘文件 → 恢复 → 内存数据
Redis提供两种持久化方式:
- RDB:快照方式,保存某个时间点的数据
- AOF:日志方式,记录每个写操作
RDB持久化
什么是RDB?
RDB(Redis Database)是将某个时间点的数据保存为二进制快照文件。
特点:
- 保存某个时间点的完整数据
- 文件紧凑,适合备份和传输
- 恢复速度快
- 可能丢失最后一次快照后的数据
RDB配置
在 redis.conf 中配置:
CONF
# 触发快照的条件
# save <秒数> <变化次数>
save 900 1 # 900秒内至少1次变化 → 触发快照
save 300 10 # 300秒内至少10次变化 → 触发快照
save 60 10000 # 60秒内至少10000次变化 → 触发快照
# 禁用RDB(注释掉save或设为空)
# save ""
# RDB文件名
dbfilename dump.rdb
# RDB文件存储目录
dir /var/lib/redis
# RDB压缩(推荐开启)
rdbcompression yes
# RDB校验(推荐开启)
rdbchecksum yes
手动触发RDB
REDIS
# SAVE:阻塞式快照(生产环境慎用)
SAVE
OK # 快照完成,期间Redis阻塞
# BGSAVE:后台快照(推荐)
BGSAVE
Background saving started # 立即返回,后台执行
⚠️ 注意: SAVE会阻塞Redis,直到快照完成。BGSAVE在后台执行,不会阻塞。
RDB文件位置
BASH
# 默认位置
/var/lib/redis/dump.rdb
# 或配置文件指定的目录
dir /data/redis
dbfilename dump.rdb
RDB恢复
Redis启动时自动加载RDB文件:
BASH
# 1. 将RDB文件放到配置的目录
cp dump.rdb /var/lib/redis/
# 2. 启动Redis
redis-server
# Redis自动加载dump.rdb恢复数据
RDB优缺点
优点:
- 文件紧凑,适合备份
- 恢复速度快
- 对性能影响小(BGSAVE后台执行)
缺点:
- 可能丢失最后一次快照后的数据
- 快照间隔内数据丢失
- 大数据量快照耗时较长
AOF持久化
什么是AOF?
AOF(Append Only File)记录每个写操作命令,恢复时重新执行这些命令。
特点:
- 记录每个写操作,数据更安全
- 文件可读,便于分析和修复
- 可能数据膨胀(需要重写)
- 恢复速度较慢
AOF配置
CONF
# 开启AOF
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"
# AOF同步策略
appendfsync everysec
# AOF重写期间是否禁用fsync
no-appendfsync-on-rewrite no
# AOF文件大小触发重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
AOF同步策略
| 策略 | 说明 | 性能 | 安全性 |
|---|---|---|---|
| always | 每个写操作都同步 | 最慢 | 最安全 |
| everysec | 每秒同步一次 | 中等 | 较安全(最多丢1秒数据) |
| no | 由操作系统决定 | 最快 | 最不安全 |
💡 推荐:
appendfsync everysec,平衡性能和安全性。
AOF重写
AOF文件会不断增长,重写可以压缩文件:
REDIS
# 手动触发AOF重写
BGREWRITEAOF
Background append only file rewriting started
重写原理:
- 读取当前内存数据
- 生成最少的命令来恢复这些数据
- 替换旧的AOF文件
重写触发条件:
CONF
# AOF文件大小比上次重写后增长100%
auto-aof-rewrite-percentage 100
# AOF文件至少64MB才触发重写
auto-aof-rewrite-min-size 64mb
AOF恢复
Redis启动时自动加载AOF文件:
BASH
# 1. 将AOF文件放到配置的目录
cp appendonly.aof /var/lib/redis/
# 2. 启动Redis
redis-server
# Redis自动加载appendonly.aof恢复数据
AOF文件损坏修复
BASH
# 检查AOF文件
redis-check-aof appendonly.aof
# 修复AOF文件
redis-check-aof --fix appendonly.aof
AOF优缺点
优点:
- 数据更安全,最多丢失1秒数据
- 文件可读,便于分析
- 支持修复损坏的文件
缺点:
- 文件较大
- 恢复速度较慢
- 对性能有一定影响
RDB vs AOF对比
| 对比项 | RDB | AOF |
|---|---|---|
| 文件大小 | 小(紧凑二进制) | 大(文本命令) |
| 恢复速度 | 快 | 慢 |
| 数据安全 | 可能丢失分钟级数据 | 最多丢失1秒数据 |
| 性能影响 | 小(后台快照) | 中等(频繁fsync) |
| 文件可读性 | 不可读 | 可读 |
| 适用场景 | 备份、主从复制 | 数据安全要求高 |
混合持久化
Redis 4.0+支持混合持久化,结合RDB和AOF的优点。
配置混合持久化
CONF
# 开启AOF
appendonly yes
# 开启混合持久化
aof-use-rdb-preamble yes
混合持久化原理
AOF重写时:
- 先以RDB格式写入当前数据(快速、紧凑)
- 再以AOF格式追加新的写操作
AOF文件结构:
[RDB格式的快照数据] + [AOF格式的增量命令]
混合持久化优势
- 恢复速度快(RDB部分)
- 数据安全(AOF部分)
- 文件大小适中
💡 推荐: Redis 4.0+使用混合持久化,兼顾性能和安全。
持久化最佳实践
场景1:缓存场景
CONF
# 缓存场景可以不持久化,或仅使用RDB
save 900 1
appendonly no
场景2:数据存储场景
CONF
# 数据存储场景使用AOF或混合持久化
save 900 1
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
场景3:高可用场景
CONF
# 同时开启RDB和AOF
save 900 1
save 300 10
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
备份策略
BASH
# 定期备份RDB和AOF文件
# 1. 使用cron定期复制文件
0 2 * * * cp /var/lib/redis/dump.rdb /backup/dump-$(date +\%Y\%m\%d).rdb
0 2 * * * cp /var/lib/redis/appendonly.aof /backup/aof-$(date +\%Y\%m\%d).aof
# 2. 使用BGSAVE创建快照后备份
redis-cli BGSAVE
sleep 10 # 等待快照完成
cp /var/lib/redis/dump.rdb /backup/
恢复策略
BASH
# 如果同时有RDB和AOF,优先使用AOF
# 1. 停止Redis
redis-cli SHUTDOWN NOSAVE
# 2. 恢复文件
cp /backup/appendonly.aof /var/lib/redis/
# 3. 启动Redis
redis-server
持久化监控
查看持久化状态
REDIS
# 查看RDB状态
INFO persistence
# 关键指标:
# rdb_last_save_time: 最后一次快照时间
# rdb_changes_since_last_save: 自上次快照后的变化次数
# aof_enabled: AOF是否开启
# aof_rewrite_in_progress: AOF重写是否在进行
监控持久化性能
BASH
# 监控RDB快照耗时
redis-cli INFO persistence | grep rdb_last_bgsave_time_sec
# 监控AOF重写耗时
redis-cli INFO persistence | grep aof_last_rewrite_time_sec
❓ 常见问题
Q RDB和AOF可以同时开启吗?
A 可以。Redis会同时使用两种方式,恢复时优先使用AOF。
Q 如何选择持久化方式?
A 缓存场景用RDB或不持久化,数据存储场景用AOF或混合持久化。
Q AOF文件太大怎么办?
A 使用BGREWRITEAOF重写,或配置自动重写条件。
Q 持久化会影响性能吗?
A 会有一定影响。RDB影响小(后台快照),AOF影响中等(频繁fsync)。
Q 如何减少数据丢失?
A 使用AOF + appendfsync everysec,最多丢失1秒数据。
📖 小节
- RDB是快照方式,保存某个时间点的数据
- AOF是日志方式,记录每个写操作
- RDB恢复快、文件小,但可能丢失数据
- AOF数据安全,但文件大、恢复慢
- 混合持久化结合两者优点(Redis 4.0+)
- 缓存场景用RDB,数据存储场景用AOF或混合持久化
- 定期备份持久化文件,监控持久化性能
📝 作业
- RDB配置: 配置RDB自动快照条件,手动触发BGSAVE
- AOF配置: 开启AOF,测试不同同步策略的性能差异
- AOF重写: 触发AOF重写,观察文件大小变化
- 数据恢复: 备份RDB/AOF文件,模拟数据恢复
下一课
下一课我们将学习 Redis 安全,学习Redis的安全配置和权限控制。



