Redis 持久化机制详解

Redis 持久化机制详解


1. 为什么要持久化?

Redis 是内存数据库,数据存在内存中,如果断电或崩溃,内存数据会丢失。持久化就是把内存数据保存到硬盘,重启后能恢复数据。


2. 两种持久化方式
(1)RDB(快照模式)

原理:像拍照一样,定期把内存数据整体保存到一个压缩的二进制文件(dump.rdb)。

fork
遍历内存数据
替换旧文件
主进程
子进程
生成RDB文件
dump.rdb
  • 关键点:子进程生成RDB,主进程继续响应请求。

触发方式

  • 自动触发:在 redis.conf 配置规则,例如:
    save 900 1    # 900秒内至少1个key被修改时触发
    save 300 10    # 300秒内至少10个key被修改时触发
    
  • 手动触发
    • SAVE:阻塞所有请求,同步保存(生产环境慎用)。
    • BGSAVE:后台异步保存(推荐)。

优点

  • 文件小(二进制压缩),恢复速度快。
  • 适合备份和灾难恢复。

缺点

  • 可能丢失最后一次快照后的数据(比如5分钟保存一次,崩溃会丢5分钟数据)。
  • 大数据量时,BGSAVEfork() 操作可能卡顿。

(2)AOF(日志模式)

原理:记录所有写操作命令(如 SETDEL),保存到文本文件(appendonly.aof)。

1. 完整工作流程
同步策略
文件过大
fork子进程
合并命令
客户端写命令
主进程命令执行
写入AOF缓冲区
刷盘到AOF文件
AOF重写
生成新AOF
替换旧文件
2. 分步解析
  1. 命令记录

    • 每一条写命令(如SET key value)会先存入AOF缓冲区
  2. 刷盘策略(appendfsync)

    模式刷盘时机数据安全性性能
    always每条命令后同步刷盘最高最差
    everysec每秒刷盘一次(默认)中等平衡
    no由操作系统决定(通常30秒)最低最高
  3. 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. 完整流程
AOF损坏
修复失败
Redis启动
是否开启AOF?
加载AOF文件
加载RDB文件
尝试修复AOF
数据恢复完成
2. 详细步骤
  1. AOF优先原则

    • 如果AOF开启,Redis会优先加载AOF文件(即使RDB文件存在)。
    • 因为AOF记录更完整(最多丢1秒数据)。
  2. AOF加载机制

    • 创建一个伪客户端,逐条执行AOF中的命令。
    • 注意:如果AOF文件损坏,可以用redis-check-aof --fix修复。
  3. 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部署的最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值