美文网首页程序员
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