zoukankan      html  css  js  c++  java
  • [redis读书笔记] 第二部分 单机数据库 RDB持久化

    内存中的rdb是会存为文件以做到RDB持久化的。RDB文件时一个二进制文件。

    一 载入与存储

    文件的载入是在server启动时进行的(rdbload()),因为AOF的更新频率比RDB高,所以如果AOF持久化功能开启,服务器会优先从AOF还原DB,只有AOF关闭,才从RDB还原数据库。

    文件的存储由rdbSave()/rdb.c来实现,SAVE/BGSAVE 命令可以触发,前者直接由Redis server处理,此时不能处理其他命令,后者会启动子进程进行处理,此时server可以处理其他命令,但是,当BGSAVE执行时,SAVE命令就不能再执行了,再次执行BGSAVE也是不行的,最后BGREWRITEAOF也是不能同时和BGSAVE执行的。

    二 周期存储

    save 900 1

    save 300 10

    save 60 10000

    上面三条命令代表满足条件之一就会触发BGSAVE:

    1. 900秒内至少有1次更新

    2. 300秒内至少10次更新

    3. 60秒内至少有10000次更新

    这些时间和更新次数的设置,存储在

    struct saveparam {
    
        // 多少秒之内
        time_t seconds;
    
        // 发生多少次修改
        int changes;
    
    };
    struct redisserver{
    ...
    struct saveparam *saveparams;   /* Save points array for RDB */
    ...
        // 自从上次 SAVE 执行以来,数据库被修改的次数
    long long dirty;                /* Changes to DB from the last save */

        // 最后一次完成 SAVE 的时间
    time_t lastsave;                /* Unix time of last successful save */

    ... };

     上面的dirty,代表上次成功的SAVE/BGSAVE后,对数据库做了多少次的更新。lastsave记录上次成功执行SAVE/BGSAVE的时间。

    serverCron()函数会做100ms的周期执行,用saveparams中的值和 dirty以及lastsave比较,来做是否更新RDB的处理。

    三 RDB的文件结构

    RDB文件是二进制文件,格式自定义,没有太多可说,举例如下:

     

  • 相关阅读:
    [TJOI2007]小朋友
    弦图小结
    Bzoj2141: 排队
    [SYZOI Round1] 滑稽♂树
    Bzoj2244: [SDOI2011]拦截导弹
    Bzoj1492: [NOI2007]货币兑换Cash(不单调的斜率优化)
    Bzoj1495: [NOI2006]网络收费
    Bzoj1496: [NOI2006]千年虫
    Bzoj1498&1416: [NOI2006]神奇的口袋
    Bzoj4553: [Tjoi2016&Heoi2016]序列
  • 原文地址:https://www.cnblogs.com/jiangz222/p/6542617.html
Copyright © 2011-2022 走看看