数据库|作为程序员你不知道Redis持久化,如何通过面试?( 二 )

  • appendonly:这个参数是AOF的开关 , 配置成yes可以打开AOF持久化机制 。 打开AOF机制后
  • appendfsync:我们知道Redis中有个事件循环 , Redis在每个事件循环都会将aof缓冲区中的内容写入到操作系统的内存缓冲区 。 这个参数就是来配置将内存缓冲区中的数据同步到硬盘上的AOF文件中的更新频率 , 有always、everysec、no三个配置值 。 always表示每次执行写入操作 , 就会立即将内存缓冲区中的内容同步到磁盘中的AOF文件中 。 这种配置性能比较差 , 但是可以确保数据不丢失 。 everysec表示每秒执行一次将操作系统的内存缓冲区中的数据同步到磁盘的AOF文件中 , 这个操作由一个线程来负责 , 性能很高 。 no表示由操作系统来控制何时将内存缓冲区中的数据同步到硬盘的AOF文件中 。 这种操作在服务器出现异常时会丢失一部分数据 。
  • 下面说说AOF文件的还原过程 , 我们知道AOF文件中存储的是所有曾经执行过的写命令 , 所以服务器只要读入并重新执行一遍AOF文件里保存的写命令 , 就可以还原服务器关闭之前的数据库内容 。 同时为了解决在Redis运行过程中AOF文件越来越大 , Redis还提供了AOF重写功能 , 关于AOF重写原理在此不具体介绍 , 有兴趣的我们可以私下讨论 。03RDB和AOF区别和联系 , 以及同时工作时的情况
    首先我们总结一下两种方式的区别和联系:
    • RDB持久化:默认开启;全量备份 , 一次性保存整个数据库;体积小 , 数据恢复快;服务器异常时可能会丢失部分数据;SAVE操作会阻塞 , BGSAVE不阻塞
    • AOF持久化:默认关闭;增量备份 , 一次保存一个修改数据库的命令;体积大 , 数据恢复慢;备份频率可以自己设置;不会出现阻塞
    当RDB和AOF同时开始时:

    • 如果RDB在执行snapshotting操作 , 那么redis不会执行AOF rewrite; 如果redis在执行AOF rewrite , 那么就不会执行RDB snapshotting
    • 如果RDB在执行snapshotting , 此时用户执行BGREWRITEAOF命令 , 那么等RDB快照生成之后 , 才会去执行AOF rewrite
    • 同时有RDB snapshot文件和AOF日志文件 , 那么redis重启的时候 , 会优先使用AOF进行数据恢复 , 因为其中的日志更完整


    推荐阅读