Redis持久化 #
一、持久化概述 #
1.1 为什么需要持久化 #
Redis是内存数据库,数据存储在内存中:
- 进程退出后数据丢失
- 服务器断电后数据丢失
- 需要持久化保证数据安全
text
持久化作用:
┌─────────────────────────────────────────────────────────┐
│ Redis 内存数据 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Key-Value 数据 │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 持久化机制 │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ RDB │ │ AOF │ │ │
│ │ │ (快照) │ │ (日志) │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 磁盘文件 │ │
│ │ dump.rdb appendonly.aof │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
1.2 持久化方式 #
text
Redis持久化方式:
1. RDB(Redis Database)
┌─────────────────────────────────────────────┐
│ 定时将内存数据快照保存到磁盘 │
│ 文件小,恢复快 │
│ 可能丢失部分数据 │
└─────────────────────────────────────────────┘
2. AOF(Append Only File)
┌─────────────────────────────────────────────┐
│ 记录每个写操作到日志文件 │
│ 数据更安全 │
│ 文件较大 │
└─────────────────────────────────────────────┘
3. 混合持久化(RDB + AOF)
┌─────────────────────────────────────────────┐
│ 结合RDB和AOF的优点 │
│ Redis 4.0+ 支持 │
└─────────────────────────────────────────────┘
二、RDB持久化 #
2.1 RDB概述 #
text
RDB特点:
优点:
- 文件紧凑,适合备份
- 恢复速度快
- 对性能影响小
缺点:
- 可能丢失数据
- 大数据集fork可能阻塞
2.2 RDB配置 #
bash
# redis.conf RDB配置
# 保存策略
save 900 1 # 900秒内至少1个key变化
save 300 10 # 300秒内至少10个key变化
save 60 10000 # 60秒内至少10000个key变化
# 禁用RDB
# save ""
# RDB文件名
dbfilename dump.rdb
# 数据目录
dir /var/lib/redis
# 压缩
rdbcompression yes
# 校验
rdbchecksum yes
# 后台保存失败时停止写入
stop-writes-on-bgsave-error yes
2.3 手动触发RDB #
bash
# SAVE: 同步保存(阻塞)
SAVE
# OK
# 会阻塞所有客户端
# BGSAVE: 后台保存(不阻塞)
BGSAVE
# Background saving started
# 查看最后保存时间
LASTSAVE
# (integer) 1700000000
# 查看RDB信息
INFO persistence
2.4 RDB文件结构 #
text
RDB文件结构:
┌─────────────────────────────────────────────┐
│ REDIS │ 版本号 │
├──────────────┼──────────────────────────────┤
│ 数据库选择 │ SELECT db │
├──────────────┼──────────────────────────────┤
│ 键值对 │ TYPE, KEY, VALUE │
├──────────────┼──────────────────────────────┤
│ 过期时间 │ EXPIRETIME, TTL │
├──────────────┼──────────────────────────────┤
│ 结束标记 │ EOF │
├──────────────┼──────────────────────────────┤
│ 校验和 │ CHECKSUM │
└─────────────────────────────────────────────┘
三、AOF持久化 #
3.1 AOF概述 #
text
AOF特点:
优点:
- 数据更安全
- 可读性强
- 支持重写
缺点:
- 文件较大
- 恢复较慢
- 对性能有一定影响
3.2 AOF配置 #
bash
# redis.conf AOF配置
# 开启AOF
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"
# 同步策略
# always: 每次写操作都同步(最安全,最慢)
# everysec: 每秒同步一次(推荐)
# no: 由操作系统决定(最快,最不安全)
appendfsync everysec
# AOF重写期间是否禁用fsync
no-appendfsync-on-rewrite no
# AOF文件大小触发重写的百分比
auto-aof-rewrite-percentage 100
# AOF文件触发重写的最小大小
auto-aof-rewrite-min-size 64mb
# 加载AOF时忽略最后一条可能不完整的命令
aof-load-truncated yes
# AOF使用RDB前缀(混合持久化)
aof-use-rdb-preamble yes
3.3 AOF重写 #
bash
# 手动触发AOF重写
BGREWRITEAOF
# Background append only file rewriting started
# AOF重写原理
# 原始AOF:
SET key1 value1
SET key1 value2
SET key1 value3
INCR counter
INCR counter
INCR counter
# 重写后:
SET key1 value3
SET counter 3
3.4 AOF文件结构 #
text
AOF文件结构:
┌─────────────────────────────────────────────┐
│ *3 │
│ $3 │
│ SET │
│ $4 │
│ key1 │
│ $6 │
│ value1 │
├─────────────────────────────────────────────┤
│ *3 │
│ $3 │
│ SET │
│ $4 │
│ key2 │
│ $6 │
│ value2 │
└─────────────────────────────────────────────┘
格式:Redis协议格式
*参数数量
$参数长度
参数值
四、混合持久化 #
4.1 混合持久化概述 #
text
混合持久化 = RDB + AOF
┌─────────────────────────────────────────────┐
│ AOF文件 │
│ ┌─────────────────────────────────────┐ │
│ │ RDB格式数据(基础数据) │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ AOF格式数据(增量数据) │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
优点:
- 恢复速度快(RDB部分)
- 数据更完整(AOF部分)
- 文件大小适中
4.2 混合持久化配置 #
bash
# 开启混合持久化
aof-use-rdb-preamble yes
# Redis 4.0+ 默认开启
五、持久化对比 #
5.1 RDB vs AOF #
text
RDB vs AOF 对比:
┌─────────────────────────────────────────────────────────┐
│ RDB │
├─────────────────────────────────────────────────────────┤
│ 优点: │
│ - 文件紧凑,适合备份 │
│ - 恢复速度快 │
│ - 对性能影响小 │
│ │
│ 缺点: │
│ - 可能丢失数据 │
│ - 大数据集fork可能阻塞 │
│ │
│ 适用场景: │
│ - 允许分钟级数据丢失 │
│ - 需要快速恢复 │
│ - 数据量大 │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ AOF │
├─────────────────────────────────────────────────────────┤
│ 优点: │
│ - 数据更安全 │
│ - 可读性强 │
│ - 支持重写 │
│ │
│ 缺点: │
│ - 文件较大 │
│ - 恢复较慢 │
│ - 对性能有一定影响 │
│ │
│ 适用场景: │
│ - 数据安全性要求高 │
│ - 不能接受数据丢失 │
│ - 数据量适中 │
└─────────────────────────────────────────────────────────┘
5.2 选择建议 #
text
选择建议:
1. 只使用RDB
- 允许数据丢失
- 需要快速恢复
- 数据量大
2. 只使用AOF
- 数据安全性要求高
- 不能接受数据丢失
3. 同时使用RDB和AOF
- 生产环境推荐
- 兼顾性能和安全
4. 使用混合持久化
- Redis 4.0+ 推荐
- 最佳选择
六、恢复数据 #
6.1 RDB恢复 #
bash
# 1. 停止Redis
redis-cli shutdown
# 2. 将RDB文件复制到数据目录
cp dump.rdb /var/lib/redis/
# 3. 启动Redis
redis-server /etc/redis/redis.conf
6.2 AOF恢复 #
bash
# 1. 停止Redis
redis-cli shutdown
# 2. 将AOF文件复制到数据目录
cp appendonly.aof /var/lib/redis/
# 3. 启动Redis
redis-server /etc/redis/redis.conf
6.3 修复AOF文件 #
bash
# AOF文件损坏时使用redis-check-aof修复
redis-check-aof --fix appendonly.aof
# 检查AOF文件
redis-check-aof appendonly.aof
6.4 检查RDB文件 #
bash
# 检查RDB文件
redis-check-rdb dump.rdb
七、最佳实践 #
7.1 生产环境配置 #
bash
# 同时开启RDB和AOF
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
7.2 定期备份 #
bash
# 定期备份RDB和AOF文件
# crontab
0 2 * * * cp /var/lib/redis/dump.rdb /backup/redis/dump_$(date +\%Y\%m\%d).rdb
0 2 * * * cp /var/lib/redis/appendonly.aof /backup/redis/appendonly_$(date +\%Y\%m\%d).aof
7.3 监控持久化 #
bash
# 查看持久化信息
INFO persistence
# 关注指标
# rdb_last_save_time: 最后保存时间
# rdb_changes_since_last_save: 自上次保存后的变化
# aof_enabled: AOF是否开启
# aof_rewrite_in_progress: AOF重写是否在进行
# aof_last_rewrite_time_sec: 上次AOF重写耗时
八、总结 #
持久化方式对比:
| 方式 | 优点 | 缺点 |
|---|---|---|
| RDB | 文件小,恢复快 | 可能丢数据 |
| AOF | 数据安全 | 文件大,恢复慢 |
| 混合 | 兼顾两者优点 | 需要4.0+ |
配置要点:
| 配置项 | 推荐值 |
|---|---|
| save | 900 1, 300 10, 60 10000 |
| appendonly | yes |
| appendfsync | everysec |
| aof-use-rdb-preamble | yes |
下一步,让我们学习Redis集群架构!
最后更新:2026-03-27