Redis 持久化

Redis数据存储在内存中,持久化可以将数据保存到磁盘。本课学习RDB和AOF两种持久化方式。

为什么需要持久化?

Redis是内存数据库,数据存储在内存中:

内存数据 → 持久化 → 磁盘文件
磁盘文件 → 恢复 → 内存数据

Redis提供两种持久化方式:

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优缺点

优点:

缺点:

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

重写原理:

重写触发条件:

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优缺点

优点:

缺点:

RDB vs AOF对比

对比项 RDB AOF
文件大小 小(紧凑二进制) 大(文本命令)
恢复速度
数据安全 可能丢失分钟级数据 最多丢失1秒数据
性能影响 小(后台快照) 中等(频繁fsync)
文件可读性 不可读 可读
适用场景 备份、主从复制 数据安全要求高

混合持久化

Redis 4.0+支持混合持久化,结合RDB和AOF的优点。

配置混合持久化

CONF
# 开启AOF
appendonly yes

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

混合持久化原理

AOF重写时:

  1. 先以RDB格式写入当前数据(快速、紧凑)
  2. 再以AOF格式追加新的写操作
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秒数据。

📖 小节

📝 作业

  1. RDB配置: 配置RDB自动快照条件,手动触发BGSAVE
  2. AOF配置: 开启AOF,测试不同同步策略的性能差异
  3. AOF重写: 触发AOF重写,观察文件大小变化
  4. 数据恢复: 备份RDB/AOF文件,模拟数据恢复

下一课

下一课我们将学习 Redis 安全,学习Redis的安全配置和权限控制。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏