redis的rdb和aof两种持久化机制原理及优缺点

rdb持久化
rdb持久化就是周期性的将redis中的数据进行持久化(保存到磁盘上), 周期可能是几分钟, 几小时, 或者几天, 开发者可以在redis的配置文件中进行配置, 这个配置后面再讲;
aof持久化
aof持久化就是实时的将redis中的数据进行持久化, 通常是redis将每一条数据保存到linux系统的os cache中(系统缓存), 每隔一秒调用一次操作系统的数据同步操作, 将数据刷到磁盘里面, 因此aof虽然具有更好的实时性, 实际上在使用时也会有一定的数据丢失, 只是相对于rdb来说丢失的数据量会更小; 另外, aof还有一个rewrite功能, 用来重写aof文件. 我们都知道, 系统的内存是一定的, 不会无限的增长, 但aof保存的是操作数据的指令, 因此会不断变大, 当aof文件达到一定程度之后, redis会先使用LRU数据清除算法, 删除不常用的数据, 然后aof会触发rewrite操作, redis会根据当前保存的数据重新写一个容量更小的aof文件;
恢复数据时优先使用
当redis在挂掉又重新启动时, 如果只使用了rdb和aof其中的一种, 那么redis会根据使用的持久化方法恢复数据, 如果两种持久化都使用了, 那么redis会优先使用aof, 因为aof中保存的数据更全;
rdb和aof优缺点对比
  • rdb优缺点

    • 优点

      • rdb生成的数据文件可以用来做数据的冷备(因为每一个rdb文件都是redis某一时刻的完整数据, aof也可以用来做冷备, 但aof文件只有一个, 容量会比较大, 而且rdb数据恢复比aof更快);
      • rdb对redis的读写服务性能影响较小, 因为redis可以启动一个fork子进程来进行数据的持久化;
      • rdb数据恢复更快, 因为rdb是一个数据文件, 恢复时直接放到内存里即可, 而aof则是一个指令的集合, 恢复数据时需要逐条执行指令, 效率比较慢;
    • 缺点

      • rdb因为保存数据的时间间隔比较大, 因此会丢失更多的数据;
      • 如果数据量过大, 由于需要进行数据保存, 可能服务会暂停较长时间(因此, 一般不要将rdb的保存时间间隔定的过长);
  • aof优缺点

    • 优点

      • 保存数据时间间隔为1秒, 数据丢失少;
      • aof日志文件以append-only模式写入, 所以没有任何寻址开销, 写入性能很快, 即使文件尾部被破坏也可以很容易修复;
      • aof有rewrite功能, 可以将容量大的aof文件进行压缩;
    • 缺点

      • aof文件过大, 恢复的话时间长, 效率低;
      • aof对每条指令进行日志存储, 对redis的性能影响较大, 会降低QPS;

本篇文章根据石衫老师的视频讲解内容编写, 在此需要感谢石衫老师对我的帮助;

你可能感兴趣的:(redis)