RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。(数据库状态:服务器中的非空数据库以及它们的键值对统称为数据库状态)

一.RDB文件的创建和载入

1.save和bgsave命令可以用来生成RDB文件

save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求

bgsave命令会派生出一个子进程,然后子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求

2.RDB文件的载入

RDB文件的载入工作是在服务器启动的时候自动执行的,只要Redis服务器在启动时检测到RDB文件存在,就会自动载入RDB文件(所以Redis并没有专门用于载入RDB文件的命令)。在服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入完成。

注意:

因为AOF文件的更新频率通常比RDB文件的更新频率高,所以:

如果服务器开启了AOF持久化功能,服务器会优先使用AOF文件来还原数据库状态。只有AOF持久化功能处于关闭时,服务器才会使用RDB文件来还原数据库状态。

2.命令执行时服务器状态

执行save命令时,客户端发送的所有命令请求都会被阻塞。save命令执行完后,客户端命令才会被处理

执行bgsave命令时,子进程创建RDB文件,服务器可以正常处理客户端的命令请求。

注意:执行bgsave命令时,客户端发送的save,bgsave命令会被服务器拒绝,客户端发送的bgrewriteaof命令会被延迟到bgsave命令执行完毕后执行

二,自动间隔性保存

1.配置bgsave保存的条件,redis.conf

save 900 1    服务器在900秒内,对数据库进行了至少一次修改

save 300 10  服务器在300秒内,对数据库进行了至少10次修改

save 60 10000  服务器在60秒内,对数据库进行了至少10000次修改

上面的条件是默认的设置(如果我们不设置 save的值,就按照上面的默认条件)。当服务器启动时,程序会根据save选项设置的保存条件,设置服务器状态redisServer结构的saveparams属性:

struct redisServer{

  //记录了保存条件的数组

  struct saveparam  *saveparams;

}

saveparams属性是一个数组,数组中的每个元素都是一个saveparam结构,每个saveparam结构都保存了一个save选项设置的保存条件:

struct saveparam{

  //秒数

  time_t seconds;

  //修改数

  int changes;

}

那怎么让上面的配置条件生效呢?

1.redisServer还维持一个dirty计数器和lastsave属性

dirty计数器记录服务器对数据库状态进行了多少次修改,执行save或bgsave命令后,dirty归零

lastsave属性是一个时间戳,记录服务器上一次成功执行save或bgsave命令的时间

2.服务器周期性操作函数serverCron默认每隔100毫秒执行一次,检查save选项设置的保存条件是否满足。

dirty和changes比较, lastsave-nowtime  和 second比较。只要有一个条件满足,服务器就执行bgsave命令

三,RDB文件结构

最新文章

  1. 【随笔】从gitHub上获取源码
  2. python里的del变量无法立刻释放内存的解决办法
  3. 对react的几点质疑
  4. java_easyui体系之目录 [转]
  5. TesCase-GUI(图形用户界面)测试
  6. java开发--JavaScript
  7. JavaScript DOM高级程序设计2.1创建可重用的对象--我要坚持到底!
  8. 三目运算符 改变<a>标签的class属性
  9. Web项目去掉Js文件红叉
  10. hack:选择符前缀法,样式属性前缀法
  11. wildfly 如何设置外网访问
  12. [转]java List和数组相互转换方法
  13. redis安装及错误排查
  14. c++函数库中一些实用的函数
  15. ELK--filebeat nginx模块
  16. Maven的特点、优点-功能摘要
  17. Slava and tanks 877C
  18. JavaScript -- FileSystemObject-文件
  19. dependencies与dependencyManagement的区(转自:http://blog.csdn.net/liutengteng130/article/details/46991829)
  20. 87. Scramble String (String; DP)

热门文章

  1. Smobiler 4.0 正式发布
  2. Vs Code 插件配置教程
  3. Java开发笔记(四)Java帝国的度量衡
  4. CA证书理解?CA证书的作用?
  5. SVN上传的时候没法显示文件名,只显示后缀名
  6. 设计模式系列之策略模式(Strategy Pattern)
  7. asp.net core webapi/website+Azure DevOps+GitHub+Docker
  8. 容器化系列 - 通过Grafana监测InfluxDB数据 on Docker
  9. selenium-确认进入了预期页面(四)
  10. c/c++ 多线程 等待一次性事件 异常处理