美文网首页
怎么区分RDB和AOF

怎么区分RDB和AOF

作者: 剑客kb | 来源:发表于2018-11-18 20:24 被阅读0次

    RDB

    • RDB持久化的功能指把当前Redis在内存中的状态保存到磁盘上,RDB文件是一个压缩过的二进制文件
    • SAVE和BGSAVE命令可以生成RDB文件,SAVE会阻塞Redis服务器进程来生成文件,BGSAVE则会派生出一个子进程来生成RDB文件,这俩个命令不能同时执行
    • Redis服务器在启动时会自动载入RDB文件来更新内存中数据库状态,但是如果服务器开启了AOF持久化功能,会优先使用AOF来更新,因为AOF更新频率比RDB更快,数据库更新
    • Redis服务器根据save选项设置的保存条件来自动执行BGSAVE命令
    save 300 10
    save 60 10000
    

    表示服务器在300秒之内对数据库进行了10次修改或者60秒内对数据库进行了10000次修改就进行BGSAVE

    AOF

    • AOF通过记录Redis服务器执行的写命令来记录数据库状态,AOF文件中除了执行数据库的SELECT是自动添加的,其他命令都是客户端发送的
    • AOF持久化可分为:命令追加、文件写入、文件同步
      -- 当一个写命令被服务器执行结束时,会以协议格式把写命令追加到aof_buf缓冲区
      -- Redis服务器进程是一个事件循环,服务器每结束一个事件循环都会调用
    flushAppendOnlyFile函数判断是否要将aof_buf缓冲区中内容写入和同步到AOF文件中,可以通过配置appendfsync的值默认是everysec来改变同步频率

    文件写入和文件同步区别:

    AOF文件载入和还原数据库

    由于Redis命令只能在客户端执行,所以服务器会起一个无网络连接的伪客户端来执行AOF文件中的命令
    

    AOF重写

    • 由于AOF文件是记录数据库的写命令,时间久了,AOF文件会很大,需要重写(AOF 重写由 Redis 自行触发,BGREWRITEAOF 仅仅用于手动触发重写操作)来减少文件体积;\color{red}{重写原理是通过对现有数据库的键值对进行读取并进行记录}
    • 为了在重写过程中,Redis服务器进程还可以响应请求,通过使用子进程来进行AOF重写:子进程保留了服务器进程的数据副本,使用子进程而不是子线程,可以保证在不使用锁的前提下保证数据的安全性
      -- 为了防止在重写时丢失命令,Redis服务器设置了一个AOF重写缓冲区,在重写开始时,把之后到重写完成时服务器接受的写指令同时发给AOF缓冲区和AOF重写缓冲区,子进程完成重写后,把重写缓冲区数据追加到新AOF文件中,在原子替换原有的AOF文件,就完成了AOF文件重写了。

    BGSAVE、SAVE、BGREWRITEAOF之间不能同时执行

    相关文章

      网友评论

          本文标题:怎么区分RDB和AOF

          本文链接:https://www.haomeiwen.com/subject/zkhdfqtx.html