[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文件是二进制文件,格式自定义,没有太多可说,举例如下:

时间: 2024-07-31 14:31:45

[redis读书笔记] 第二部分 单机数据库 RDB持久化的相关文章

[redis读书笔记] 第二部分 单机数据库

一 命令下发的实现 redis.c里,大家能看到redisCommandTable[] 的实现,列出了支持的所有命令.大部分的入参为redisClient *c,当一条REDIS命令下发,调用流程如下 在createClient里会组装下传的client,其中就会调用selectDb()来选择数据库,而数据库中存储了一个字典结构dict *dict,这个dict里的键就是执行REDIS命令的键,值即redis对象robj. redisDb里的结构如下,下图已经是个抽象的图,比如HashObjec

[redis读书笔记] 第二部分 集群

1. 一个集群会包含多个节点(一个节点就是一个reid是服务器),CLUST MEET <ip><port>可以添加一个node到集群,命令执行后,两个node之间就会进行握手,握手成功构成集群 2.节点(即redis服务器)启动时,将cluster-enable配置为YES,来决定是否开启服务器的集群模式,开启的node功能如下 3.集群数据结构 CLUSTER MEET的流程,在两个node进行了握手后,发起者NODE A会发送gossip协议消息给所有集群里的其他nodes,

读书笔记第二周《程序员的自我修养》

读书笔记第二周<程序的自我修养> ??刚看到书名的时候以为这是一本讲述程序员为人处世,享受生活的文章,当我抱着当小说看消遣的心情从群里下载下来的时候,却发现这实际上是一本干货满满的书.当我看到副标题--链接,装载与库, 我意识到这会是一本让我受益匪浅的书,因为我没有选修过操作系统,编译原理相关的课程,对于代码 是如何在电脑上跑起来的是毫无概念的,每次配置环境变量,配置链接库,都是一头雾水.而且我认为要成为一个优秀的程序员 ,仅仅满足于代码能运行是远远不够的,只有对背后的运行机制有所了解,才能写

《javascript权威指南》读书笔记——第二篇

<javascript权威指南>读书笔记--第二篇 金刚 javascript js javascript权威指南 今天是今年的196天,分享今天的读书笔记. 第2章 词法结构 2.1 字符集 JavaScript程序是用Unicode字符集编写. Unicode是ASCII和Latin-1的超集,支持几乎所有语言. ES3 要求支持Unicode 2.1及后续版本 ES5 要求支持Unicode 3及后续版本 2.1.1 区分大小写 JavaScript是区分大小写的. HTML 并不区分大

《Java并发变成实践》读书笔记---第二章 线程安全性

什么是线程安全性 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问.从非正式的意义上来说,对象的状态是指存储在状态变量(例如实例或静态域)中的数据."共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以发生变化.所以编写线程安全的代码更侧重于如何防止在数据上发生不受控的并发访问. 如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误

《深入理解Java虚拟机》读书笔记---第二章 Java内存区域与内存溢出异常

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来.这一章就是给大家介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产生的问题. 1.运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 1.1程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型中里,字

In-memory Computing with SAP HANA读书笔记 - 第二章:SAP HANA overview

本文为In-memory Computing with SAP HANA on Lenovo X6 Systems第二章SAP HANA overview的读书笔记. 本章最重要的部分是SAP HANA architecture SAP HANA overview SAP HANA数据库是结合了行式,列式和对象的内存数据库,可以充分利用硬件的并行处理能力. SAP HANA appliance是一体化的软硬件设施,核心还是SAP HANA. SAP HANA architecture HANA的

《Redis设计与实现》[第二部分]单机数据库的实现-C源码阅读(一)

1.数据库 关键字:键空间,过期,删除策略 数据结构源码 //redisServer中属性太多,篇幅限制,故只列本章描述相关的属性 struct redisServer { //... // 数据库 //一个数组,保存着服务器中的所有数据库 redisDb *db; // 服务器的数据库数量 int dbnum; //.. } ; Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个

[redis读书笔记] 第三部分 多机数据库的实现 复制

复制即主服务器向从服务器的数据同步,REDIS的实现具有参考意义,尤其对于有主从同步需求,数据量不是特别大,可以用内存存储,其中巧妙之处在于 offset和缓冲区的配对使用,让主服务器能够很快的知道应该同步哪些数据,即使面对多个从服务器可以做到处理流程一样. 书中分析了老版本和新版本在复制过程中,断链发生时的不同处理,来描述复制的过程. 老版本复制主要2个方式: 1. 从服务器主动发送SYNC给主服务器,主服务器启动BGSAVE,生成一个DB文件,传给从服务器,从服务器加载DB文件,然后主服务器