Redis持久化

1. Redis持久化都有哪些类型?

   Redis持久化分为两种: RDB持久化与AOF持久化

2. 两种持久化的异同?

  (1)RDB持久化:RDB持久化是将我们运行过程中Redis数据库中的对象保存到RDB文件中。

    a. RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。

    b. 生成RDB文件的两个命令:SAVE, BGSAVE。

    c. RDB文件载入期间,会一直处于阻塞状态,直到载入工作完成。

    (2)AOF持久化:AOF持久化是将我们运行过程中的命令保存在AOF文件中,这样只需要重新执行这些命令就可以恢复到原来的状态。

3. SAVE与BGSAVE的区别?

  (1) SAVE命令会阻塞当前线程,而BGSAVE命令会派生出一个子进程来负责创建RDB文件。

  (2) 由于BGSAVE命令不需要阻塞,因此Redis允许通过配置save选项设置保存条件,让服务器每隔一段时间执行一次BGSAVE命令。

    例如:save 200 1 表示在200秒之内至少对数据库进行1次修改时,BGSAVE命令将会执行。

4. AOF持久化功能的实现?

  (1)AOF持久化功能的实现可以分为命令追加,文件写入,文件同步三个步骤。

    a. 命令追加:当AOF持久化功能处于打开状态时,服务器每执行完一个写命令后,会以协议格式追加到aof_buf缓冲区的末尾。

    b. 写入与同步:服务器在每次结束一个时间循环之前,会调用函数flushAppendOnlyFile考虑是否将aof_buf缓冲区的内容写入到AOF文件中。

      flushAppendOnlyFile的行为可以由appendfsync来配置

        always:将aof_buf缓冲区的内容同步并写入到AOF文件中

        everysec:将aof_buf中的文件写入到AOF文件中,如果上次同步AOF文件的时间超过1s,那么再次对AOF文件进行同步,并且这个过程由一个单独的线程来完成。

        no:将aof_buf缓冲区中的文件写入到AOF文件中,但是不会进行同步,同步的时间有操作系统来决定。

5. 文件的写入和同步?

  (1)为了提高文件写入的效率,当用户进行一次写操作时,操作系统并不会立即将文件写入到磁盘中,而是会暂时将数据写入到一个缓冲区中,当这个缓冲区被填满时,才会同意将数据写入到磁盘中。

  (2)这种方法写入效率虽然很好,但是遇到计算机停机等情况时,操作系统来不及将缓冲区中的文件正式写入到磁盘就会导致数据丢失。

  (3)所以,当我们说写入时意味着只是将数据写入到了操作系统的缓冲区中,只有同步才会将数据真正的写入到磁盘中。

6. AOF持久化效率与安全?

  当appendfsync为always时,服务器在每次时间循环,都会把命令写入到aof_buf缓冲区中,并立即将缓冲区中的内容写入并同步。这样做效率最低但是最安全。

  当appendfsync为everysec时,服务器在每次时间循环,都会把缓冲区aof_buf的文件写入到AOF文件中,并且每个1s都会进行一次同步。这种方式足够快,并且即使发生故障也只会丢失1s的数据。

  当appendfsync为no时,服务器每次时间循环,只会把缓冲区aof_buf中的文件写入AOF文件而不会进行同步。

    

原文地址:https://www.cnblogs.com/liwangcai/p/11876577.html