首页 > 数据库 >15天玩转redis —— 第十篇 对快照模式的深入分析

15天玩转redis —— 第十篇 对快照模式的深入分析

时间:2023-04-18 12:34:43浏览次数:43  
标签:900 15 第十篇 redis server saveparams 线程 快照 save

      我们知道redis是带有持久化这个能力了,那到底持久化成到哪里,持久化成啥样呢???这篇我们一起来寻求答案。

 

一:快照模式

  或许在用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,这两个命令都会强制将数据刷新到硬盘中,如下图:

15天玩转redis —— 第十篇 对快照模式的深入分析_工作线程

 

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

 

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

15天玩转redis —— 第十篇 对快照模式的深入分析_持久化_02

从上面的代码中,有没有看到一个重点,那就是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操作,看过方法的注释,接下来我们来找一下具体逻辑。

15天玩转redis —— 第十篇 对快照模式的深入分析_其他_03

 

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

 

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

15天玩转redis —— 第十篇 对快照模式的深入分析_redis_04

 

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

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

15天玩转redis —— 第十篇 对快照模式的深入分析_其他_05

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

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

 

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

 

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

标签:900,15,第十篇,redis,server,saveparams,线程,快照,save
From: https://blog.51cto.com/u_15353947/6202811

相关文章

  • 15天玩转redis —— 第三篇 无敌的列表类型
     据说60%的人使用redis看重的是redis中的list类型,那这个list有什么用呢???不用我说大家都明白,做队列使用呗,为什么用它呢,很简单呗,因为有了它我就不需要专门的MQ产品啦,比如说RabbitMQ,ActiveMQ等等。。。对吧。 一:实战   先我们还是看一下List列表给......
  • 15天玩转redis —— 第六篇 有序集合类型
       今天我们说一下Redis中最后一个数据类型“有序集合类型”,回首之前学过的几个数据结构,不知道你会不会由衷感叹,开源的世界真好,写这些代码的好心人真的要一生平安哈,不管我们想没想的到的东西,在这个世界上都已经存在着,曾几何时,我们想把所有数据按照数据结构模式组成后......
  • 15天玩转redis —— 第二篇 基础的字符串类型
        我们都知道redis是采用C语言开发,那么在C语言中表示string都是采用char[]数组的,然后你可能会想,那还不简单,当我执行如下命令,肯定是直接塞给char[]数组的。如果你真的这么想的话,会有几个问题就要过来砍你了,先我们来找一个redis手册,http://doc.redisfans.com/ 第......
  • 1581. 进店却未进行过交易的顾客
    【题目】表:Visits+-------------+---------+|ColumnName|Type   |+-------------+---------+|visit_id   |int    ||customer_id|int    |+-------------+---------+visit_id是该表的主键。该表包含有关光临过购物中心的顾客的信息。 表:Transaction......
  • 20230415运动之白云洞爬山
      爬到山顶,就是为了吃碗素面,感受不一样的风景!   ......
  • Qt5.15.0 升级至 Qt5.15.9 遇到的一些错误
    按照之前我写的文章教程,可以很简单的编译出静态库(仅供学习交流)编译windows上的qt静态库编译出静态库后,替换旧版本的库,见我另一篇文章教程VS2019配置QT库之所以没有直接上Qt6.0以上的版本,是因为Qt6.0对比Qt5删减了不少东西(我之前已经测试过了),这就导致项目要有......
  • 好压 v6.4.0.11152 去广告剔除驱动优化版
    更新流水:2023.01.10:重新修正 5.9.8.10920最新正式版本2022.12.05:自改官方 6.4.0.11152最新正式版本更多更新已省略......修改内容:by.QiuQuan&安心爱√去除程序自校验(感谢QiuQuan提供思路);√去界面所有2345字样和Logo,无任何2345标识;√删除:多核云查杀,今日热点弹窗,驱......
  • 在EasyCVR中点击电子地图,出现快照不消失情况是什么原因?
    EasyCVR视频融合平台基于云边端一体化架构,部署轻快、功能灵活,平台可支持多协议、多类型设备接入,包括:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等(具体见下图)。在视频能力上,可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、......
  • 【2023-04-15】连岳摘抄
    23:59人与人之间,要内心相通,始觉共同存在;人海苍茫,但愿有心肝的人,多多相互温暖。                                                 ——殷海光专注力始终是稀缺资源,是......
  • Unique Snowflakes uva11572
    找最长的,没有相同元素的区间 双指针#include<iostream>#include<set>usingnamespacestd;constintN=1e6+2;intn,a[N];voidsolve(){ intx=1,y=1,ans=0; set<int>st; while(y<=n){ while(y<=n&&!st.count(a[y]))s......