新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT > 数据库 > Redis

Redis RDB文件解析

时间:2019-05-15 10:41:25  来源:  作者:

rdb文件是redis实现持久化方式的一种,即通过save或bgsave操作,执行数据备份,生成的.rdb后缀的数据文件。

save和bgsave都是调用rdbSave实现备份的,只不过save是阻塞式,bgsave是非阻塞式,通过fork子进程执行备份,主进程可以继续接收外部请求。源码如下:

一、save方法

直接调用rdbsave()方法

void saveCommand(client *c) {
 if (server.rdb_child_pid != -1) {
 addReplyError(c,"Background save already in progress");
 return;
 }
 rdbSaveInfo rsi, *rsiptr;
 rsiptr = rdbPopulateSaveInfo(&rsi);
 if (rdbSave(server.rdb_filename,rsiptr) == C_OK) {
 addReply(c,shared.ok);
 } else {
 addReply(c,shared.err);
 }
}

二、bgsave方法

调用的是rdbSaveBackground()方法

/* BGSAVE [SCHEDULE] */
void bgsaveCommand(client *c) {
 int schedule = 0;
 /* The SCHEDULE option changes the behavior of BGSAVE when an AOF rewrite
 * is in progress. Instead of returning an error a BGSAVE gets scheduled. */
 if (c->argc > 1) {
 if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"schedule")) {
 schedule = 1;
 } else {
 addReply(c,shared.syntaxerr);
 return;
 }
 }
 rdbSaveInfo rsi, *rsiptr;
 rsiptr = rdbPopulateSaveInfo(&rsi);
 if (server.rdb_child_pid != -1) {
 addReplyError(c,"Background save already in progress");
 } else if (server.aof_child_pid != -1) {
 if (schedule) {
 server.rdb_bgsave_scheduled = 1;
 addReplyStatus(c,"Background saving scheduled");
 } else {
 addReplyError(c,
 "An AOF log rewriting in progress: can't BGSAVE right now. "
 "Use BGSAVE SCHEDULE in order to schedule a BGSAVE whenever "
 "possible.");
 }
 } else if (rdbSaveBackground(server.rdb_filename,rsiptr) == C_OK) { #实际上调用的是rdbSaveBackground方法
 addReplyStatus(c,"Background saving started");
 } else {
 addReply(c,shared.err);
 }
}

三、rdbSaveBackground方法

int rdbSaveBackground(char *filename, rdbSaveInfo *rsi) {
 pid_t childpid;
 long long start;
 if (server.aof_child_pid != -1 || server.rdb_child_pid != -1) return C_ERR;
 server.dirty_before_bgsave = server.dirty;
 server.lastbgsave_try = time(NULL);
 openChildInfoPipe();
 start = ustime();
 if ((childpid = fork()) == 0) {
 int retval;
 /* Child */
 closeListeningSockets(0);
 redisSetProcTitle("redis-rdb-bgsave");
 retval = rdbSave(filename,rsi); # 最终调用的还是rdbsave()方法,但是是在子进程中调用的
 if (retval == C_OK) {
 size_t private_dirty = zmalloc_get_private_dirty(-1);
 if (private_dirty) {
 serverLog(LL_NOTICE,
 "RDB: %zu MB of memory used by copy-on-write",
 private_dirty/(1024*1024));
 }
 server.child_info_data.cow_size = private_dirty;
 sendChildInfo(CHILD_INFO_TYPE_RDB);
 }
 exitFromChild((retval == C_OK) ? 0 : 1);
 } else {
 /* Parent */
 server.stat_fork_time = ustime()-start;
 server.stat_fork_rate = (double) zmalloc_used_memory() * 1000000 / server.stat_fork_time / (1024*1024*1024); /* GB per second. */
 latencyAddSampleIfNeeded("fork",server.stat_fork_time/1000);
 if (childpid == -1) {
 closeChildInfoPipe();
 server.lastbgsave_status = C_ERR;
 serverLog(LL_WARNING,"Can't save in background: fork: %s",
 strerror(errno));
 return C_ERR;
 }
 serverLog(LL_NOTICE,"Background saving started by pid %d",childpid);
 server.rdb_save_time_start = time(NULL);
 server.rdb_child_pid = childpid;
 server.rdb_child_type = RDB_CHILD_TYPE_DISK;
 updateDictResizePolicy();
 return C_OK;
 }
 return C_OK; /* unreached */
}

在了解rdb文件是怎么生成后,接下来就看看rdb文件内容,rdb文件是二进制格式的,直接打开是乱码,可以使用命令 od -c xxx.rdb 查看

四、RDB文件内容解析

本地先安装redis吧(此处省略)

由于是之前安装好的,此处执行flushall命令情况redis数据库

Redis RDB文件解析

 

接下来执行save,默认是dump.rdb文件,文件名在redis.window.conf里配置,

conf文件配置

# The filename where to dump the DB
dbfilename dump.rdb

使用od -c 查看

Redis RDB文件解析

 

RDB文件结构包括REDIS、rdb_version、databases、EOF以及check_sum,databases部分包含SELECTDB、db_number、key_value_pairs,如下图:

Redis RDB文件解析

 


Redis RDB文件解析

 

其中:
REDIS:是证明rdb文件,5字节
0006:版本号,1字节
377:EOF,
377之后的是checknum
因为无数据,所以也没有databases信息

再看一个有数据的rdb文件

Redis RDB文件解析

 

其中:
REDIS:是证明rdb文件,5字节
0006:版本号,1字节
376:SELECTDB
:0号数据库,默认有16个数据库,总数可在配置中修改,databases 16
:是数据类型type,0是string
004:数据长度
name:是字符串key
004:值长度
jack:key的值
377:EOF
377后面的是checknum



Tags:Redis   点击:()  评论:()
声明:本站部分内容来自互联网,如有任何版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
本文是通过watch(监控)+mutil(事务)实现应用于在分布式高并发处理等相关场景。下边先通过redis-cli.exe来测试多个线程修改时,遇到问题及解决问题。高并发下修改同一个key遇到的...【详细内容】
2019-07-19   Redis  点击:(1)  评论:(0)  加入收藏
应用场景 缓存系统:用于缓解数据库的高并发压力 计数器:使用Redis原子操作,用于社交网络的转发数,评论数,粉丝数,关注数等 排行榜:使用zset数据结构,进行排行榜计算 实时系统:使用Red...【详细内容】
2019-07-08   Redis  点击:(5)  评论:(0)  加入收藏
单机轻松10万QPS的Redis竟然是单线程的?!很多人都认为高并发就意味着多核心多进程,但这两者之间并没有特别大的联系。除了Redis之外,像Node.JS也是如此,那么为什么Redis能够如此...【详细内容】
2019-07-08   Redis  点击:(12)  评论:(0)  加入收藏
基本介绍Hash 也可以用来存储用户信息,和 String 不同的是 Hash 可以对用户信息的每个字段单独存储,String 则需要序列化用户的所有字段后存储.并且 String 需要以整个字符...【详细内容】
2019-07-08   Redis  点击:(14)  评论:(0)  加入收藏
前言:之前看到过一道面试题:Redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现?笔者结合在工作上遇到的问题学习分析,希望看完这篇文章能对大家有所帮助。从一...【详细内容】
2019-06-27   Redis  点击:(22)  评论:(0)  加入收藏
首先如果你之前用Redis的分布式锁的姿势正确,并且看过相应的官方文档的话,这个问题So easy.我们来看 坦白说,如果你英文棒棒哒那么看英文文档可能更好理解By default lock w...【详细内容】
2019-06-26   Redis  点击:(34)  评论:(0)  加入收藏
概述redis一般用来做缓存,可能很多朋友都没有深入去学习redis的相关命令,只是涉及到安装部署而已,所以今天主要总结介绍一下redis字符串的一些命令。SET语法:SET key value [EX...【详细内容】
2019-06-21   Redis  点击:(11)  评论:(0)  加入收藏
主从概念 ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读写比率是10:...【详细内容】
2019-06-19   Redis  点击:(6)  评论:(0)  加入收藏
概述 在Redis所支持的五种数据类型当中,zset是一个有序集合的实现,集合中的每个元素由成员对象member和分值score组成,整个有序集合按照分值score从小到大排序的,其中分值是可以...【详细内容】
2019-06-17   Redis  点击:(15)  评论:(0)  加入收藏
Redis有哪些数据结构?字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。很多人面试时都遇到过这种场景吧?其实除了上面的几种常见数据结构,还需要加上 数据结构...【详细内容】
2019-06-11   Redis  点击:(20)  评论:(0)  加入收藏
概述在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2019年6月国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一...【详细内容】
2019-06-11   Redis  点击:(21)  评论:(0)  加入收藏
前言NoSQL,泛指非关系型的数据库。随着互联网不断的发展,传统的关系数据库在应付新互联网模式的网站,特别是超大规模和高并发的SNS类型的纯动态网站已经显得力不从心,暴露了很...【详细内容】
2019-06-11   Redis  点击:(24)  评论:(0)  加入收藏
面试疑问写在前面,看过本文,让那些没使用过redis的也能回答上来面试官的问题,不至于陷入太尴尬的境地!因为现在好多面试官不单单只是问你,用没用过redis,而是会一直问下去,比如:你项...【详细内容】
2019-06-06   Redis  点击:(33)  评论:(0)  加入收藏
概述Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以...【详细内容】
2019-06-05   Redis  点击:(30)  评论:(0)  加入收藏
rdb文件是redis实现持久化方式的一种,即通过save或bgsave操作,执行数据备份,生成的.rdb后缀的数据文件。save和bgsave都是调用rdbSave实现备份的,只不过save是阻塞式,bgsave是非...【详细内容】
2019-05-15   Redis  点击:(54)  评论:(0)  加入收藏
为什么需要持久化呢?通常情况下redis的数据全部存储在内存中,数据库一旦故障发生重启数据会全部丢失,即使是在redis cluster或者redis sentinel模式下主从同步数据的恢复仍然...【详细内容】
2019-05-15   Redis  点击:(28)  评论:(0)  加入收藏
概述redis跟memcached类似,都是内存数据库,不过redis支持数据持久化,也就是说redis可以将内存中的数据同步到磁盘来持久化,以确保redis 的数据安全。不过持久化这块可能比较容易...【详细内容】
2019-05-15   Redis  点击:(17)  评论:(0)  加入收藏
一、热点Key问题产生的原因 二、热点Key问题的危害 三、解决方案 四、热点 key 处理 五、方案对比一、热点Key问题产生的原因1、用户消费的数据远大于生产的数据(热卖商品、...【详细内容】
2019-05-15   Redis  点击:(33)  评论:(0)  加入收藏
最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容...【详细内容】
2019-05-14   Redis  点击:(34)  评论:(0)  加入收藏
通过思维导图整理的Redis的重要知识点一、持久化 二、复制 三、阻塞 四、Redis内存 五、Redis内存优化 六、哨兵 七、缓存设计 ...【详细内容】
2019-05-10   Redis  点击:(23)  评论:(0)  加入收藏
推荐资讯
相关文章
栏目更新
栏目热门