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