← 返回首页

redis的两个持久化机制

Redis 作为内存数据库,为了防止服务器宕机或重启导致数据丢失,提供了两种核心的持久化机制:RDB(快照模式) 和 AOF(日志追加模式)。这两种机制在实现原理、数据安全性及性能表现上各有侧重。

1. RDB(Redis Database)—— 内存快照

RDB 的核心原理是在指定的时间间隔内,将 Redis 某一时刻的内存全量数据生成一个压缩的二进制快照文件(默认文件名为 dump.rdb)并保存到磁盘中。

  • 工作机制:当触发 RDB 时,Redis 主进程会通过 fork() 创建一个子进程。子进程利用操作系统的“写时复制(Copy-On-Write)”技术,在不阻塞主线程处理客户端请求的情况下,将内存数据写入临时文件,完成后原子替换旧文件。触发方式包括手动执行 BGSAVE 命令,或根据配置文件中的规则自动触发(如 save 900 1 表示900秒内至少1个key变化即触发)。
  • 优点:
    • 恢复极快:二进制压缩格式使得文件体积非常小,重启时直接加载到内存即可,大数据集恢复速度远快于 AOF。
    • 性能友好:由子进程完成持久化,对主进程性能影响较小,非常适合用于定期的灾难恢复和数据备份传输。
  • 缺点:
    • 数据安全性相对较低:由于是定时全量备份,如果 Redis 发生故障,可能会丢失最后一次生成快照之后的所有数据(例如默认配置下最多可能丢失5分钟的数据)。
    • Fork 开销:在数据量极大(如几十GB)时,fork 子进程的操作本身可能会带来短暂的阻塞耗时。

2. AOF(Append Only File)—— 日志追加

AOF 采用增量记录的方式,将 Redis 接收到的每一个写操作命令以文本日志的形式追加到文件(默认文件名为 appendonly.aof)中。当 Redis 重启时,通过重新执行这些命令来还原数据。

  • 工作机制与刷盘策略:AOF 提供了三种写回磁盘的策略,允许开发者在性能和数据安全之间做权衡:
    • always:每次写入都同步到磁盘。数据最安全(零丢失),但 IO 压力极大,性能最差。
    • everysec(默认推荐):每秒同步一次。兼顾了高性能和高安全性,极端情况下最多丢失1秒的数据。
    • no:交由操作系统决定何时同步。性能最好,但数据安全性最低。
  • 优点:
    • 数据安全性高:实时记录写操作,极大地降低了数据丢失的风险。
    • 可读性强且易修复:纯文本格式便于人工阅读和审计;若文件意外损坏,可使用官方提供的 redis-check-aof 工具进行修复。
  • 缺点:
    • 文件体积大:由于记录了所有的写命令,相同数据集下 AOF 文件通常比 RDB 大数倍。
    • 恢复速度慢:启动时需要逐条重放日志命令,数据量越大,恢复耗时越长。为了解决文件膨胀问题,Redis 提供了 AOF 重写机制(BGREWRITEAOF),通过合并冗余命令来压缩文件体积。

总结与选型建议

在实际生产环境中,单纯使用某一种机制往往难以满足需求。自 Redis 4.0 起,官方引入了混合持久化机制(配置 aof-use-rdb-preamble yes),这也是目前生产环境的最优解。它结合了二者的优势:在 AOF 重写时,先将当前内存数据以 RDB 格式写入文件头部,再将后续的增量写命令以 AOF 格式追加在后。这样既保证了极快的加载速度,又确保了极高的数据安全性。