zoukankan      html  css  js  c++  java
  • RDB持久化

    redis是一个内存数据库,所有我们需要将他定时存在磁盘上,如果没有开启AOF,那么会生成RDB文件进行存储,其实就是个二进制文件

    RBD文件通过SAVE BGSAVE进行创建,

    SAVE会阻塞服务器进程,如果执行的话,那么client在这个期间发出的请求都不会响应

    BGSAVE其实是创建fork出一个子进程来执行,其实本质他们都是在实行rdbsave

    因为AOF的频率比RDB的频率高,所以启动服务器的时候,我们遵循着下面的原则

    如果执行BGSAVE的时候,收到了save会被拒绝,因为他们都是执行rdbsave,两个进程同时进行的话会产生竞争

    如果发出了BGREWRIEAOF的话,那么会等到BGSAVE执行完了在执行。相反的话会被拒绝,两个不可能同时进行,如果同时进行,会进行大量的写入磁盘操作

    间隔性保存

    struct redisserver{

      saveparam

      long long dirty

      time_t lastsave

    }

    上述三个其实表示了执行BGSAVE的条件

    saveparam就是指向的条件

    eg:

    save 300 1 300秒内执行一次

    dirty表示上一次bgsave结束后执行了多少次操作

    lastsave表示的上面bgsave的时间戳

    通过计算并且循环判断就是可以确定是否需要执行BGSAVE

     

    REDIS服务器会每隔100毫秒执行依稀,servercron函数,就是检查这个条件

    RDB文件结构:

    第一个大写的常亮,表示读的是RDBle,version是版本,EOF是数据库读完的结束标志,check_sum是一个效验码

    中间的是各个数据库中的数据

    上面表示的每一个数据库中的数据,主要是keyvaluepairs

     

    上面就是两种带过期键和不带的两种结构

    对于key其实就是一个字符串,对于value

    (1)如果大于20字节,那么就会以压缩的方式存储,如果不是,那么会按原样存储

    无压缩的结构和压缩的结构如下

    对于其他的比如列表对象,集合,有序集合,哈希,都会在最前有一个总的长度,对于值,如果是字符串的话,还会在前面有一个length的记录

  • 相关阅读:
    android 和 java 调色板
    BroadCast简述
    android intent
    android intent隐身启动和Intent过滤器
    坦克大战(TankWar)
    android menu
    WAS5.1上LogFactory的错误
    持续加班的夜晚中
    忙,无心写blog
    曾经,我是那么的有激情
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/7075492.html
Copyright © 2011-2022 走看看