持久化概述
Redis 是内存数据库,数据存储在内存中,服务器重启后数据会丢失。为了保证数据安全,Redis 提供了多种持久化机制,将内存中的数据保存到磁盘上。
内存数据
快速访问
→
持久化
保存到磁盘
→
数据恢复
重启后恢复
🔄 RDB 快照持久化
RDB(Redis Database)是 Redis 默认的持久化方式,它将某个时间点的数据集快照保存到磁盘上。
RDB 工作原理
内存数据 → fork子进程 → 生成RDB文件 → 替换旧文件
特点:二进制格式、文件小、恢复快
RDB 配置参数:
配置项 | 说明 | 示例 |
---|---|---|
save |
自动保存条件 | save 900 1 (900秒内至少1个key变化) |
dbfilename |
RDB文件名 | dbfilename dump.rdb |
dir |
文件保存目录 | dir /var/lib/redis |
rdbcompression |
是否压缩 | rdbcompression yes |
rdbchecksum |
是否校验 | rdbchecksum yes |
RDB 配置示例:
# redis.conf 配置 # 自动保存策略 save 900 1 # 900秒内至少1个key发生变化 save 300 10 # 300秒内至少10个key发生变化 save 60 10000 # 60秒内至少10000个key发生变化 # RDB文件配置 dbfilename dump.rdb dir /var/lib/redis/ rdbcompression yes rdbchecksum yes # 当RDB保存失败时停止写入 stop-writes-on-bgsave-error yes
手动触发 RDB:
# 阻塞式保存(会阻塞Redis服务) SAVE # 非阻塞式保存(推荐) BGSAVE # 查看最后一次保存时间 LASTSAVE # 获取RDB保存状态 INFO persistence
📝 AOF 日志持久化
AOF(Append Only File)记录每个写操作命令,通过重新执行这些命令来恢复数据。
AOF 工作原理
写命令 → 追加到AOF缓冲区 → 同步到AOF文件 → 定期重写
特点:记录操作日志、数据完整性高、文件较大
AOF 配置参数:
配置项 | 说明 | 示例 |
---|---|---|
appendonly |
启用AOF | appendonly yes |
appendfilename |
AOF文件名 | appendfilename "appendonly.aof" |
appendfsync |
同步策略 | appendfsync everysec |
auto-aof-rewrite-percentage |
重写触发百分比 | auto-aof-rewrite-percentage 100 |
auto-aof-rewrite-min-size |
重写最小文件大小 | auto-aof-rewrite-min-size 64mb |
AOF 同步策略:
策略 | 说明 | 性能 | 安全性 |
---|---|---|---|
always |
每个写命令都同步 | 慢 | 最高 |
everysec |
每秒同步一次(推荐) | 快 | 高 |
no |
由操作系统决定 | 最快 | 低 |
AOF 配置示例:
# redis.conf 配置 # 启用AOF appendonly yes appendfilename "appendonly.aof" # 同步策略(推荐everysec) appendfsync everysec # AOF重写配置 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 重写期间是否同步 no-appendfsync-on-rewrite no # AOF文件损坏时的处理 aof-load-truncated yes
AOF 重写:
# 手动触发AOF重写 BGREWRITEAOF # 查看AOF重写状态 INFO persistence # AOF重写示例 # 原始AOF文件可能包含: SET key1 "value1" SET key1 "value2" SET key1 "value3" DEL key2 SET key2 "new_value" # 重写后的AOF文件: SET key1 "value3" SET key2 "new_value"
🔄 混合持久化
Redis 4.0 引入的混合持久化,结合了 RDB 和 AOF 的优点。
混合持久化配置:
# 启用混合持久化 aof-use-rdb-preamble yes # 混合持久化文件结构: # [RDB格式的数据] + [AOF格式的增量数据] # 优点: # 1. 文件更小(RDB格式压缩率高) # 2. 恢复更快(RDB格式加载快) # 3. 数据更完整(AOF记录增量)
持久化方式对比
特性 | RDB | AOF | 混合持久化 |
---|---|---|---|
文件大小 | 小 | 大 | 中等 |
恢复速度 | 快 | 慢 | 快 |
数据完整性 | 可能丢失 | 完整 | 完整 |
性能影响 | 小 | 大 | 小 |
可读性 | 二进制 | 文本 | 混合 |
持久化最佳实践
💡 生产环境建议:
- 同时启用 RDB 和 AOF:RDB 用于备份,AOF 用于数据恢复
- AOF 使用 everysec:平衡性能和数据安全
- 定期备份 RDB 文件:复制到其他服务器或云存储
- 监控磁盘空间:确保有足够空间存储持久化文件
- 测试恢复流程:定期验证数据恢复的正确性
⚠️ 注意事项:
- 磁盘性能:持久化会增加磁盘I/O,使用SSD提升性能
- 内存使用:RDB fork 子进程会临时占用额外内存
- 文件权限:确保 Redis 进程有读写持久化文件的权限
- 网络传输:主从复制时需要传输 RDB 文件
🔧 持久化配置示例
完整的生产环境配置:
# redis.conf 生产环境持久化配置 # RDB 配置 save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb dir /var/lib/redis/ rdbcompression yes rdbchecksum yes stop-writes-on-bgsave-error yes # AOF 配置 appendonly yes appendfilename "appendonly.aof" appendfsync everysec auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb no-appendfsync-on-rewrite no aof-load-truncated yes # 混合持久化 aof-use-rdb-preamble yes # 内存优化 maxmemory-policy allkeys-lru maxmemory 2gb
持久化监控脚本:
#!/bin/bash # Redis 持久化监控脚本 REDIS_CLI="redis-cli" LOG_FILE="/var/log/redis-persistence.log" # 检查RDB状态 rdb_status=$(${REDIS_CLI} LASTSAVE) echo "$(date): Last RDB save: ${rdb_status}" >> ${LOG_FILE} # 检查AOF状态 aof_info=$(${REDIS_CLI} INFO persistence | grep aof) echo "$(date): AOF info: ${aof_info}" >> ${LOG_FILE} # 检查文件大小 rdb_size=$(du -h /var/lib/redis/dump.rdb 2>/dev/null | cut -f1) aof_size=$(du -h /var/lib/redis/appendonly.aof 2>/dev/null | cut -f1) echo "$(date): RDB size: ${rdb_size}, AOF size: ${aof_size}" >> ${LOG_FILE} # 检查磁盘空间 disk_usage=$(df -h /var/lib/redis | tail -1 | awk '{print $5}') echo "$(date): Disk usage: ${disk_usage}" >> ${LOG_FILE}
数据恢复流程:
# 1. 停止Redis服务 sudo systemctl stop redis # 2. 备份当前数据文件 cp /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.backup cp /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.backup # 3. 恢复数据文件 # 从备份恢复RDB文件 cp /backup/dump.rdb /var/lib/redis/dump.rdb # 或从备份恢复AOF文件 cp /backup/appendonly.aof /var/lib/redis/appendonly.aof # 4. 设置正确的文件权限 chown redis:redis /var/lib/redis/dump.rdb chown redis:redis /var/lib/redis/appendonly.aof chmod 660 /var/lib/redis/dump.rdb chmod 660 /var/lib/redis/appendonly.aof # 5. 启动Redis服务 sudo systemctl start redis # 6. 验证数据恢复 redis-cli INFO keyspace redis-cli DBSIZE
🚀 性能优化建议
RDB 优化:
- 调整保存频率:根据业务需求平衡数据安全和性能
- 使用 BGSAVE:避免使用阻塞式的 SAVE 命令
- 监控内存使用:fork 时需要额外内存,确保系统内存充足
- SSD 存储:使用 SSD 提升 I/O 性能
AOF 优化:
- 选择合适的同步策略:推荐使用 everysec
- 定期重写:避免 AOF 文件过大影响性能
- 重写期间配置:合理设置 no-appendfsync-on-rewrite
- 文件系统优化:使用支持快速写入的文件系统
混合持久化优化:
- 启用混合模式:获得更好的性能和数据安全平衡
- 监控文件大小:定期检查持久化文件大小
- 备份策略:制定完整的备份和恢复策略