美文网首页程序员
redis 持久化 - RDB 和 AOF

redis 持久化 - RDB 和 AOF

作者: BlackChen | 来源:发表于2018-01-11 18:01 被阅读80次

    redis持久化

    RDB

    RDB持久化功能,可以将Redis在内存中的数据库状态保存到磁盘中,避免数据意外丢失.


    生成RDB文件

    • SAVE
      会阻塞Redis服务器进程,直到RDB文件创建完毕为止.
    • BGSAVE
      不会阻塞服务器,会fork一个子进程,由子进程来创建RDB文件.

    自动间隔保存

    • 用户通过save选项设置多个保存条件,只要一个满足,服务器就会执行BGSAVE
    save 900 1  ----服务器在900秒之内,对数据做了至少一次修改
    save 300 10 -----300秒之内,对数据库进行了至少10次修改
    save 60 10000 ----60秒之内,对数据库进行了至少10000次修改
    

    RDB文件结构

    • RDB文件头
      5个字节,'R','E','D','I','S'
    • db_version
      长度4字节,是字符串表示的整数,记录了RDB文件的版本号
    • database
      1. 如果服务器数据库为空,这个部分也是空
    • EOF
      长度为1字节,常亮,标志RDB文件的结束
    • check_sum

    8字节长无符号整数,保存着校验和,由前面4部分计算得出,载入时,通过check_sum比对来确定RDB文件是否有损坏

    database部分

    一个RDB文件的database 部分可以保存多个非空数据库,每个非空数据库在RDB文件中都可以保存为SELECTDB,db_number,key_value_pairs


    • SELECTDB
      常量,1字节,表示接下来读取的是数据库号码
    • db_number
      保存着数据库号码,根据号码大小的不同,这个长度可以是1字节,2字节,5字节,读取这个属性后,会切换到对应的数据库上
    • key_value_pairs
      存储数据库中的所有键值对,如果键值对带有过期时间,过期时间会和键值对保存在一起,根据不停的键值对数量,类型,内容,以及是否有过期时间等条件,key_value_pairs部分的长度也不同
      1. 不带过期时间


      2. 带过期时间


    AOF

    Append Only File
    通过服务器所执行的写命令来记录数据库状态.


    AOF持久化实现

    分为: 命令追加,文件写入,文件同步

    • 命令追加
      服务器执行完一个写命令后,会已协议格式将被执行的命令追加到服务器状态的aof_buf缓冲区结尾.
    • 文件写入和同步
      事件循环结束之前,会调用flushAppendOnlyFile 考虑是否将aof_buf缓存区中的内容吸入保存到AOF文件中.
      flushAppendOnlyFile 由 服务器配置的appendfsync值决定

    AOF重写

    随着时间流逝,AOF文件中的内容越来越多,文件体积越来越大,为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写功能.

    • 子进程进行AOF重写
    • 重写期间的写命令请求,会写到AOF重写缓存区,AOF重写完成后,再把AOF重写缓冲区中的数据写入AOF文件中

    注: 因为AOF文件更新频率比RDB高,所以服务器开启了AOF持久化功能,服务器会优先使用AOf文件还原数据.只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态

    相关文章

      网友评论

        本文标题:redis 持久化 - RDB 和 AOF

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