Redis的RDB持久化

前言:redis是内存数据库,它将自己的数据保存在内存中,所以如果不想办法将内存中的数据保存到磁盘里面,那么一旦服务器程序退出,服务器中的数据就会消失不见。

为了解决这个问题,redis提供了RDB持久化功能,这个功能可以将redis内存中的数据保存到磁盘中。RDB持久化既可以手动执行,又可以通过服务器配置来定期执行。RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。

1、RDB文件的创建和载入

    有两个redis命令可以生成RDB文件,一个是SAVE,一个是BGSAVE。

    SAVE命令可以直接阻塞服务器进程,知道RDB文件创建完毕。

    BGSAVE则是会派生出一个子进程,然后由子进程负责创建RDB文件,父进程继续处理命令请求。

    而RDB文件的载入是在服务器启动的时候自动执行的,所以redis并没有用于载入RDB文件的命令,只要redis服务器启动的时候检测到了RDB文件的存在,他就会自动载入RDB文件。

    另外, 因为 AOF 文件的保存频率通常要高于 RDB 文件保存的频率, 所以一般来说, AOF 文件中的数据会比 RDB 文件中的数据要新。因此, 如果服务器在启动时, 打开了 AOF 功能, 那么程序优先使用 AOF 文件来还原数据。 只有在 AOF 功能未打开的情况下, Redis 才会使用 RDB 文件来还原数据。

    注意:

    BGSAVE过程中,如果重新发送SAVE或者BGSAVE命令会被服务器拒绝,因为同时执行rdbSAVE可能会产生竟态。

    BGSAVE和BGREWRITEAOF不能同时执行的。如果BGSAVE正在执行,那么客户端发送的BGREWRITEAOF会被延迟到BGSAVE命令执行完毕之后执行。如果BGREWRITEAOF正在执行,那么BGSAVE会被拒绝。其实这两个命令在操作方面并没有什么冲突的大方,都是子进程来执行,不能同时执行只是出于性能的考虑——两个子进程同时大量写入磁盘总感觉不是一个好主意。


2、自动间隔性保存

    因为BGSAVE命令不阻塞服务器的主进程,所以redis允许用户在配置文件中通过设置save选项,来每隔一段时间自动执行一次BGSAVE。

save 900 1

save 300 10

save 60   10000

   上述条件只需要满足一个即执行BGSAVE。比如900秒之类,对数据库至少对了一次修改。

 2.1、保存设置的save条件

struct redisServer { 

    struct saveparam *saveparams; // 记录了保存条件的数组

    long long dirty; // 修改计数器

    time_t lastsave;// 上一次执行保存的时间

}


struct saveparam{

    time_t seconds; // 秒数

    int changes; //修改数 
}

    dirty计数器记录距离上一次成功执行SAVE或者BGSAVE命令之后,服务器对数据库状态进行了多少次修改。

    lastsave属性是一个UNIX时间戳,记录了服务器上一次成功执行SAVE或BGSAVE命令的时间。

2.2、检查保存条件是否满足    

    redis的服务器周期性操作函数severCron默认是100ms执行一次(hz设置),该函数其中一项工作就是检查save选项所设置的保存条件是否满足,如果满足,执行BGSAVE指令。


3、RDB文件结构



RDB文件结构

 REDIS:

文件的最开头保存着 REDIS 五个字符,标识着一个 RDB 文件的开始。在读入文件的时候,程序可以通过检查一个文件的前五个字节,来快速地判断该文件是否有可能是 RDB 文件。

RDB-VERSION:

一个四字节长的以字符表示的整数,记录了该文件所使用的 RDB 版本号。因为不同版本的 RDB 文件互不兼容,所以在读入程序时,需要根据版本来选择不同的读入方式。

EOF :

常量,长度为 1 字节, 这个常量标志着 RDB 文件正文内容的结束, 当读入程序遇到这个值的时候, 它知道所有数据库的所有键值对都已经载入完毕了。

check_sum :

是一个 8 字节长的无符号整数, 保存着一个校验和, 这个校验和是程序通过对 REDIS 、 db_version 、 databases 、 EOF 四个部分的内容进行计算得出的。 服务器在载入 RDB 文件时, 会将载入数据所计算出的校验和与 check_sum 所记录的校验和进行对比, 以此来检查 RDB 文件是否有出错或者损坏的情况出现。

3.1、 databases部分

一个 RDB 文件的 databases 部分可以保存任意多个非空数据库。


包含0号和3号数据库的RDB文件

每个非空数据库的RDB文件都可以保存为 SELECTDB 、 db_number 、 key_value_pairs 三个部分


RDB文件在数据库中的结构

SELECTDB 常量的长度为 1 字节, 当读入程序遇到这个值的时候, 它知道接下来要读入的将是一个数据库号码。

db_number 保存着一个数据库号码, 根据号码的大小不同, 这个部分的长度可以是 1 字节、 2 字节或者 5 字节。 当程序读入 db_number 部分之后, 服务器会调用 SELECT 命令, 根据读入的数据库号码进行数据库切换, 使得之后读入的键值对可以载入到正确的数据库中。

key_value_pairs 部分保存了数据库中的所有键值对数据, 如果键值对带有过期时间, 那么过期时间也会和键值对保存在一起。 根据键值对的数量、类型、内容、以及是否有过期时间等条件的不同, key_value_pairs 部分的长度也会有所不同。key_value_pairs具体编码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350