美文网首页
redis持久化

redis持久化

作者: 鸿雁长飞光不度 | 来源:发表于2021-03-10 20:52 被阅读0次

    Redis文件的创建与载入

    通过执行save(阻塞)或者bgsave(异步执行)生成RDB文件,RDB文件在服务器启动的时候自动执行。

    • 如果服务器开启了AOF持久化功能,优先使用AOF文件还原数据库状态。
    • 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件还原数据库状态。
    • BGSAVE命令和BGREWRITEAOF命令不能同时到达
    • 服务器载入RDB文件期间,会一直阻塞状态,直到完全载入为止。

    自动间隔性保存

    bgsave命令自动执行
    save 900 1 900秒内对数据库进行了至少一次修改
    dirty计数器:每次修改增加1
    lastsave属性:记录上次服务器修改的时间。
    通过saveParams的条件,根据serverCron函数100ms检查条件是否符合

    RDB文件结构

    REDIS|db_version|databases|EOF|check_sum|

    databases:database_0 database_1 database_2

    AOF 持久化实现

    aof持久化功能的实现可以分为命令追加(append),文件写入,文件同步。

    • 命令追加
      aof持久化功能打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令
      追加到aof_buf缓冲区末尾

    • AOF文件的写入和 同步
      在事件循环中,接收客户端命令请求,以及向客户端发送命令回复。在每次结束一个事件循环
      之前调用flushAppendOnlyFile,根据策略决定

    appendsync

    appendfsync flushAppendOnlyFile函数行为
    always 将aof缓冲区所有内容写入并同步到AOF文件
    everysec(默认) 将aof_buf缓冲区所以偶内容写入AOF文件,如果上次同步AOF文件超过1s,将再次对AOF文件进行同步,由专门线程负责执行。
    no 将aof_buf缓冲区所有内容写入AOF,但不对AOF文件进行同步,何时同步由操作系统完成。
    • AOF文件的载入与数据还原
    1. 创建一个不带网络连接的伪客户端
    2. 从AOF文件种分析并读取出一条写命令
    3. 使用伪客户端执行谢明了
    4. 重复执行2,3。
    • AOF重写

    是通过读取服务器当前数据库状态实现的,读取数据库某个key的最新状态后,替换掉之前对应key的多条命令。

    一个命令执行的命令过长的时候,会拆分成多个命令,比如sadd 元素数量过多。

    redis将AOF重写程序放到子进程执行。

    • AOF重写期间,服务器进程可以继续处理命令请iu去。
    • 子进程带有服务器进程的数据副本,使用子进程不是线程,可以避免使用锁的情况下,保证数据安全性。

    问题:aof重写期间服务器进程继续处理命令请求,新的命令可能对数据库状态修改,导致当前数据库状态和AOF保存的数据不一致。

    解决问题方案:设立了AOF重写缓冲区,会将执行AOF重新期间的产生的新命令放在缓冲区。当aof重写完成后,在将AOF重写缓冲区产生的指令写入到
    AOF文件末尾

    相关文章

      网友评论

          本文标题:redis持久化

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