文章目录
Redis 持久化机制详解
1. 为什么要持久化?
Redis 是内存数据库,数据存在内存中,如果断电或崩溃,内存数据会丢失。持久化就是把内存数据保存到硬盘,重启后能恢复数据。
2. 两种持久化方式
(1)RDB(快照模式)
原理:像拍照一样,定期把内存数据整体保存到一个压缩的二进制文件(dump.rdb
)。
- 关键点:子进程生成RDB,主进程继续响应请求。
触发方式:
- 自动触发:在
redis.conf
配置规则,例如:save 900 1 # 900秒内至少1个key被修改时触发 save 300 10 # 300秒内至少10个key被修改时触发
- 手动触发:
SAVE
:阻塞所有请求,同步保存(生产环境慎用)。BGSAVE
:后台异步保存(推荐)。
优点:
- 文件小(二进制压缩),恢复速度快。
- 适合备份和灾难恢复。
缺点:
- 可能丢失最后一次快照后的数据(比如5分钟保存一次,崩溃会丢5分钟数据)。
- 大数据量时,
BGSAVE
的fork()
操作可能卡顿。
(2)AOF(日志模式)
原理:记录所有写操作命令(如 SET
、DEL
),保存到文本文件(appendonly.aof
)。
1. 完整工作流程
2. 分步解析
-
命令记录:
- 每一条写命令(如
SET key value
)会先存入AOF缓冲区。
- 每一条写命令(如
-
刷盘策略(appendfsync):
模式 刷盘时机 数据安全性 性能 always
每条命令后同步刷盘 最高 最差 everysec
每秒刷盘一次(默认) 中等 平衡 no
由操作系统决定(通常30秒) 最低 最高 -
AOF重写(关键!):
- 触发条件:
- 文件大小超过
auto-aof-rewrite-min-size
(默认64MB)。 - 增长比例超过
auto-aof-rewrite-percentage
(默认100%)。
- 文件大小超过
- 重写过程:
- fork子进程遍历内存数据,生成新AOF临时文件。
- 重写期间的新命令会同时写入旧AOF文件+重写缓冲区。
- 重写完成后,将缓冲区命令追加到新AOF文件,原子替换旧文件。
- 触发条件:
3. AOF文件内容示例
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n # 原始命令
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$9\r\nnewvalue\r\n # 覆盖写
重写后简化为:
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$9\r\nnewvalue\r\n # 只保留最终状态
优点:
- 数据安全性高(最多丢1秒数据)。
- 文件可读(文本格式),方便人工修复。
缺点:
- 文件比RDB大,恢复速度慢。
- 频繁写入时对性能影响较大。
3. 混合持久化(Redis 4.0+)
原理:AOF重写时,先用RDB格式保存当前数据快照,再追加后续命令。
文件内容示例:
[RDB二进制数据][AOF命令日志]
优点:
- 恢复时先加载RDB(快),再执行AOF命令(全),兼顾速度和安全性。
启用方式:
aof-use-rdb-preamble yes
4. 如何选择?
场景 | 推荐方式 | 理由 |
---|---|---|
允许分钟级数据丢失 | RDB | 恢复快,适合缓存等非关键数据。 |
不允许数据丢失 | AOF(everysec) | 最多丢1秒数据,适合订单、账户等关键数据。 |
既要快又要安全 | RDB + AOF(混合持久化) | 生产环境推荐方案。 |
5. 数据恢复流程
1. 完整流程
2. 详细步骤
-
AOF优先原则:
- 如果AOF开启,Redis会优先加载AOF文件(即使RDB文件存在)。
- 因为AOF记录更完整(最多丢1秒数据)。
-
AOF加载机制:
- 创建一个伪客户端,逐条执行AOF中的命令。
- 注意:如果AOF文件损坏,可以用
redis-check-aof --fix
修复。
-
RDB回退机制:
- 如果AOF关闭或文件不存在,则加载RDB文件。
- RDB恢复速度更快(直接加载二进制数据)。
6. 常见问题
Q1: AOF重写期间数据会重复写入吗?
- 会。重写期间的新命令会同时写入:
- 旧的AOF文件(防止重写失败丢数据)。
- 重写缓冲区(最后合并到新AOF文件)。
- 影响:额外磁盘开销,但能保证数据安全。
Q2: RDB和AOF能同时用吗?
- 可以!生产环境建议同时开启:
- RDB 用于定期备份。
- AOF 确保实时数据安全。
Q3: 如何监控持久化状态?
redis-cli info persistence
输出示例:
# RDB状态
rdb_last_save_time:1630000000
rdb_changes_since_last_save:100
# AOF状态
aof_enabled:1
aof_rewrite_in_progress:0
7. 配置示例
# RDB配置
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb # RDB文件名
# AOF配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
aof-use-rdb-preamble yes # 启用混合持久化
最终总结
- AOF的核心价值在于数据安全,通过命令日志+重写机制实现实时持久化。
- RDB的价值在于快速备份恢复,适合冷备场景。
- 混合持久化是两者优势的结合,也是现代Redis部署的最佳实践。