复制自:http://www.cnblogs.com/huangxincheng/p/5010795.html

一:快照模式

  或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是SNAPSHOTTING模式,还是一种是AOF模式,而且在实战场景下用的最多的

莫过于SNAPSHOTTING模式,这个不需要反驳吧,而且你可能还知道,使用SNAPSHOTTING模式,需要在redis.conf中设置配置参数,比如下面这样:

# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save "" save 900 1
save 300 10
save 60 10000

上面三组命令也是非常好理解的,就是说900指的是“秒数”,1指的是“change次数”,接下来如果在“900s“内有1次更改,那么就执行save保存,同样

的道理,如果300s内有10次change,60s内有1w次change,那么也会执行save操作,就这么简单,看了我刚才说了这么几句话,是不是有种直觉在

告诉你,有两个问题是不是要澄清一下:

1.  上面这个操作应该是redis自身进行的同步操作,请问是否可以手工执行save呢? 

 

   当然可以进行手工操作,redis提供了两个操作命令:save,bgsave,这两个命令都会强制将数据刷新到硬盘中,如下图:

2. 看上面的图,貌似bgsave是开启单独线程的,请问是吗?

确实如你所说,bgsave是开启次线程进行数据刷新的,不信的话我们来看看代码,它的代码是在rdb.c源文件中,如下:

从上面的代码中,有没有看到一个重点,那就是fork方法,它就是一些牛人口中说的什么fork出一个线程,今天你也算终于看到了,其实redis并不是单纯

的单线程服务,至少fork告诉我们,它在一些场景下也是会开启工作线程的,然后可以看到代码会在工作线程中执行同步的bgsave操作,就这么简单。

3. 能简单说下saveparams参数在redis源码中的逻辑吗?

可以的,其实在redis中有一个周期性函数,叫做serverCron,它会周期性启动,大概会做七件事情,如redis注释所说:

/* This is our timer interrupt, called server.hz times per second.
* Here is where we do a number of things that need to be done asynchronously.
* For instance:
*
* - Active expired keys collection (it is also performed in a lazy way on
* lookup).
* - Software watchdog.
* - Update some statistic.
* - Incremental rehashing of the DBs hash tables.
* - Triggering BGSAVE / AOF rewrite, and handling of terminated children.
* - Clients timeout of different kinds.
* - Replication reconnection.
* - Many more...
*
* Everything directly called here will be called server.hz times per second,
* so in order to throttle execution of things we want to do less frequently
* a macro is used: run_with_period(milliseconds) { .... }
*/ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {

上面的红色字体就是做了我们所关心的save操作,看过方法的注释,接下来我们来找一下具体逻辑。

从上面这段代码逻辑,你应该可以发现以下几点:

<1>. saveparams参数是在server对象下面,而server对象正好是redisServer类型,如下图:

从上面图中 *saveparams 的注释上来看,你应该知道*saveparams是saveparam类型的数组,那现在是不是有强烈的好奇心想看一下saveparam

类型是怎么定义的的呢??? 如下图:

可以看到,saveparam参数里面有两个参数,seconds就是保存秒数,changes就是改变量,而这二个参数就对应着我们配置文件中的900 0 这样的

配置节,想起来的没有哈~~~

<2>  然后我们通过if发现,如果终满足,就会最终调用rdbSaveBackground来持久化我们的rdb文件,简单吧。。。

好了,大概就这样了,希望对你有帮助。

redis十-对快照模式分析的更多相关文章

  1. Redis(十二):redis两种持久化方法对比分析

    前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数 ...

  2. Redis持久化——内存快照(RDB)

    最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 最新:Redis持久化--内存快照(RDB) 一文回顾Redis五大对象(数据类型) Redis对象--有序集 ...

  3. 一个redis因为关闭快照无法连接的BUG

    [2018-04-19 11:00:08,587: ERROR/MainProcess] consumer: Cannot connect to redis://127.0.0.1:6379/0: M ...

  4. Redis持久化——RDB快照

    一.是什么? 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里. Redis会单独创建(fork)一个子进程来进行持久化,会先将数 ...

  5. 11 redis之rdb快照持久化

    一:Redis持久化配置 Redis的持久化有2种方式[快照,是日志] 二:Rdb快照的配置选项 save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 // 如果3 ...

  6. 高可用Redis(十二):Redis Cluster

    Redis Cluster是Redis官方提供的Redis集群功能 1.为什么要实现Redis Cluster 1.主从复制不能实现高可用 2.随着公司发展,用户数量增多,并发越来越多,业务需要更高的 ...

  7. 高可用Redis(十):Redis原生命令搭建集群

    1.搭建Redis Cluster主要步骤 1.配置开启节点 2.meet 3.指派槽 4.主从关系分配 2.环境说明 两台虚拟机,IP地址分别为:192.168.81.100和192.168.81. ...

  8. redis解决保存快照失败后redis无法写入的问题

    通过关闭配置项stop-writes-on-bgsave-error解决该问题. redis 127.0.0.1:6379> config set stop-writes-on-bgsave-e ...

  9. Redis 十分钟快速入门

    本教程是一个快速入门教程,所以Redis的命令只是简单介绍了几个常用的,如果有其他需求请求官网查看API 使用. 1. Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的ke ...

随机推荐

  1. 单词「TJOI 2013」(AC自动机)

    传送门 我们正常的建好Trie后求一遍fail.之后对于每一个节点,从它的fail连向它一条单项边.然后从根节点开始dfs. 记sum[i]代表从根到i号节点所代表的的字符串出现的次数,即该点的权值. ...

  2. primecoin在ubuntu16.04上部署服务:

    primecoin在ubuntu16.04上部署服务: 一.下载Tomcat,Jdk,primecoin(公司内部文件) 注意Tomcat版本需要高于Jdk的,不然会报错. 二.把它们都解压到你要的安 ...

  3. Python学习第五课——基本数据类型一之list

    列表(list) # 列表 (list) # 创建列表 列表里面可以是数字.字符串.列表.布尔值...什么都可以 li = [1, 2, 3, "hanhan", "ju ...

  4. IDEA配置数据库连接失败的问题

    今天采用IDEA连接数据库失败了,有几个问题需要注意 首先笔者采用的数据库版本为8.0.17而IDEA自带版本是5.2.26大概,于是首先出现的问题是驱动不匹配,那么就需要换成我自己的版本,配置如下 ...

  5. container-coding-codec

    1 数字容器格式 container format 1.1 一些音频专有的容器: 1.2 静态图像专用的容器: 1.3 视频容器,可以容纳多种类型的音频和视频以及其他媒体 1.4 视频容器格式概述 1 ...

  6. 还是应该立个flag

    6月份 开通博客的想法很简单,就是决定要学习C++和算法,写博客作为督促自己的一个方式,因为还没有系统的学习,自认为写博客或见解有些力所不及,决定先从自己的一篇随笔开始,因为我知道自己一旦开始,就会坚 ...

  7. 本地模拟内存溢出并分析Dump文件

    java Dump文件分析 前言 dump文件是java虚拟机内存在某一时间点的快照文件,一般是.hprof文件,下面自己模拟一下本地内存溢出,生成dump文件,然后通过mat工具分析的过程. 配置虚 ...

  8. L/SQL Developer 和 instantclient客户端安装配置

    PL/SQL Developer 和 instantclient客户端安装配置(图文) 一: PL/SQL Developer 安装 下载安装文件安装,我这里的版本号是PLSQL7.1.4.1391, ...

  9. 前端学习笔记系列一:12 js中获取时间new date()的用法

    获取时间: 1  var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.get ...

  10. 小程序父子组件onLoad和Created之间的问题

    今天开发日历插件时,遇到了以下问题: 因为需要在父组件的onLoad里加载接口从而得到每一天的房间数据,然后将数据存进小程序缓存. 接着在子组件里 获取小程序缓存来得到父组件传来的房间数据,在子组件里 ...