Redis深度历险笔记06 Redis持久化RDB和AOF

redis持久化机制

redis提供了持久化机制将内存中的数据写到硬盘里,以便于系统故障后可以恢复数据。redis提供了两种持久化操作。一种是RDB快照,另一种是AOF日志。

RDB快照是全量备份,是内存数据的二进制序列化形式,AOF日志记录的是内存数据修改的指令记录文本,是增量备份,需要定期进行AOF重写。

  • RDB快照持久化

    • Redis可以通过创建快照来获得内存中的数据在某个时间点上的副本,生成的RDB文件是一个二进制文件,保存在硬盘中,所以即使Redis服务器退出,也可以使用硬盘中的RDB文件还原数据库的状态。
    • 快照是一次全量备份,通过保存键值对来记录数据库状态。
    • 持久化过程:
      • Redis使用操作系统的多进程 (Copy On Write) 机制来实现快照持久化。
      • Redis在持久化时会fork一个子进程,和父进程共享内存里面的数据。持久化完全交给子进程来处理,父进程继续处理客户端的请求,对数据进行修改。这时候就会使用操作系统的COW机制来进行数据段页面的分离,当父进程对其中一个页面的数据进行修改时,会将被共享的页面复制一份,对这个复制的页面进行修改,这时子进程相应的页面是没有变化的,所以子进程可以安心得遍历数据,并序列化到磁盘。
    • 缺点:频繁执行 fork 操作创建子进程的成本较高;存在丢失数据的风险,因为 RDB 快照文件每隔一段时间生成一次,如果 redis 宕机了,就会丢失这段时间的数据。
  • AOF日志持久化

    • AOF日志存储的是对内存修改的指令记录,所以可以通过顺序执行所有的指令来恢复Redis的数据。
    • Redis在收到客户端的修改指令后,先将指令存储到磁盘中AOF日志中,再执行指令。
    • Redis长期运行,AOF日志会变得非常长,所以需要对AOF日志进行瘦身。
    • AOF重写过程:
      • Redis提供了 bgrewriteaof 指令用于对AOF进行瘦身。原理是开辟一个子进程对内存数据进行遍历转换成Redis操作指令,序列化到一个新的AOF日志文件中。redis 服务器会维护一个 AOF 重写缓冲区,用来记录 AOF 操作期间执行的新命令。子进程序列化完毕后再将操作期间发生的增量AOF日志追加到这个新的AOF日志文件中,追加完毕后就替代旧的AOF日志文件,重写就完成了。
    • 缺点:重放 AOF 日志的速度相比 RDB 来说会慢很多。
  • Redis 4.0混合持久化

    • 重启Redis时,如果用RDB来恢复数据,会丢失大量数据;如果用AOF日志来恢复,又会比较耗时。所以Redis 4.0提供了一个新的持久化选项—混合持久化。先加载RDB的内容,再重放增量的AOF日志,效率比较高。

猜你喜欢

转载自blog.csdn.net/weixin_43338519/article/details/105514519