redis十-对快照模式分析
复制自: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文件,简单吧。。。
好了,大概就这样了,希望对你有帮助。
最新文章
- 基于Angularjs+jasmine+karma的测试驱动开发(TDD)实例
- jQuery String Functions
- .NET中Debug模式与Release模式
- 哈希-4 Values whose Sum is 0 分类: POJ 哈希 2015-08-07 09:51 3人阅读 评论(0) 收藏
- 如何拷贝CMD命令行文本到粘贴板
- javascript中,数组常用的方法有哪些?
- 微信开发-Jssdk调用分享实例
- Duanxx的C++得知:计算位数
- Jquery学习笔记: attr和 prop的区别,以及为html标签自定义属性
- Docker container communication with ovs
- D3.js-数值自动变动的条形图表
- HTTP请求范例
- 远程调用服务框架-CXF(WebServic)
- Centos7中hadoop配置
- Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作
- C# Word文档中插入、提取图片,文字替换图片
- noip2012
- vue处理用户输入
- Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)
- 用VS自带的打包程序打包Web程序,安装时安装中断
热门文章
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:基本的表格
- java并发:初探sleep方法
- 1.Neo4j简介(Neo4j系列)
- python 函数map()、filter()、reduce()
- 【C#】关于左移/右移运算符的使用
- ss性能
- HTML学习第七天(一)
- wpf和winform的区别
- SQL state [72000]; error code [1461]; ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 ; nested exception is java.sql.BatchUpdateException: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
- spring boot 2.18