• 第五课作业——持久化


    第五课时作业

    静哥

    by 2016.3.14~2016.3.20

     

    【作业描述】

    1.配置aof,并且形成rewrite之前和之后的对比

    2.配置rdb,手动命令和后台触发,截图对比持久化之前和之后的数据文件的差异

     

    【作业一:配置aof,并且形成rewrite之前和之后的对比】

    【测试-1:没有配置持久化方式的情况下,手动执行bgrewriteaof命令】

     

    当前redis数据库有13keystring类型,手动执行bgrewriteaof命令:

     

    注意:调用bgrewriteaof命令:

    1) 如果当前正在进行aof rewrite,则会返回客户端Background append only file rewriting already in progress

    2) 如果当前正在进行rbd dump,则会等待rbd dump进行完再开启:Background append only file rewriting scheduled

    3) 如果当前没有进行aof rewrite和rdb dump,则进行aof rewrite:

    Background append only file rewriting started 

    dir参数指定的目录下,生成一个appendonly.aof文件,文件内容如下:

     

    【测试-2:没有配置持久化方式的情况下,多次set操作,aof方式手动保存】

     

     

    因为没有在配置文件设置自动保存,在手动保存前,日志无变化

     

     

    手动执行bgrewriteaof命令,也就是aof持久化方式,可以看到新生成aof存储文件,dump.rdb文件是rdb持久化方式的存储文件,因此dump.rdb文件大小无变化)

     

     

    日志Background append only file rewriting started by pid 18486表示,bgrewriteaof命令,会fork一个子进程(进程号18486)来执行保存;

    日志AOF rewrite child asks to stop sending diffs.Parent agreed to stop sending diffs. Finalizing AOF...表示:

    日志Concatenating 0.00 MB of AOF diff received from parent表示:

    日志SYNC append only file rewrite performed表示:fsync将数据落地到磁盘,最后close文件,将临时文件重命名,确保生成的aof文件完全ok,避免出现aof不完整情况,最后输出这条日志;

    日志AOF rewrite: 6 MB of memory used by copy-on-write表示:fork子进程做AOF重写,将会耗用6mb内存作copy on write

     

     


    【作业二:配置rdb,手动命令和后台触发,截图对比持久化之前和之后的数据文件的差异】

    【测试1——rdb快照模式】

    Rdb文件是二进制的,不存在回车行来分隔

    1、 手动方式save命令保存数据到磁盘:

    初,redis库里无数据,dump.rdb文件内容如下:

     

     

     

    执行set命令设置键值,此时没执行save命令,dump.rdb文件大小依旧为18Mredis日志没有记录;

     

     

     

     

     

    【总结】

    只有执行save命令OK,才将redis数据写入磁盘

     

    【测试2——rdb模式,手动bgsave

    紧接着如上测试

    初,

     

     

    只执行set命令设置键值,没有保存,数据存放在缓存,没写入磁盘,因此此时dump.rdb文件大小不变

     

    执行bgsave命令和save命令的返回值不同,save命令是在当前线程下执行,会阻塞客户端其他请求的执行;bgsave返回:Background saving started,是fork一个子进程来执行数据保存,不会阻塞客户端其他请求的执行;

     

    Dump.rdb文件大小增长,说明执行bgsave后,将数据保存到磁盘

     

    对比save命令和bgsave命令所产生的日志文件也可以看出:bgsave命令作为后台执行的命令,fork一个子进程(进程号为30543)将数据保存到磁盘;

    日志RDB: 6 MB of memory used by copy-on-write表示:redis借助fork命令的copy on write机制(私有内存非共享内存),在生成快照时,将当前进程fork出一个子进程,然后在子进程中循环所有的数据,将数据写成为RDB文件。这个过程消耗6MB内存。

     

    【测试3——rdb模式,配置文件设置保存触发条件】

    紧接着上面测试

    即,120秒内变化1次,就自动执行bgsave

    初:

     

     

    等候120秒后,查看dump.rdb文件大小和日志

     

     

    配置文件配置的自动保存和bgsave命令区别在于,会根据配置的触发条件,本次测试的是120秒内改变1次就保存,当满足触发条件,就fork一个子进程执行bgsave命令;

    在紧接着上面测试,测试2个以及2个以上触发条件如何处理?当满足第一个条件后,第二个save条件是否会重新计时??

    初,

     

    120schange 1次的日志:

     

    60schange 2次的日志:

     

    60schange 1次,61s120内再change 1次的日志:

     

    60schange 2次,61s120内再change 1次的日志:

     

    【总结】

    对于这个配置下,redis里的周期函数serverCron每隔0.1s执行一次,当在60秒内检测到数据改变次数达到两次了,就会执行一次bgsave。每次写盘后,记录写盘时间,以及保存数据库发生多少次操作。重新计时(因此我在60秒的前20秒内执行完第二次change,数据就被刷到磁盘了

    61s120s直接change一次,因为周期检测,没在60s内检测到数据改变2次(以上),不满足save 60 2条件,转而检测是否满足save 120 1,因此在我change后,满足1次修改,就直接刷入磁盘。

    总结计时,save参数设置后,redis的周期函数serverCron会周期性检测,从时间范围短、操作频繁的save条件开始检测,一旦检测到满足就立刻执行bgsave;不满足,则转而检测时间次长、操作次频繁的save条件。。。。

     

     

     

     

     





  • 相关阅读:
    ActiveMQ (二):JMS
    Java消息队列--ActiveMq 初体验
    利用 UltraEdit 重新排版 XML 结构数据
    Java中的Arrays工具类
    数组的下标与长度
    数组的一维与多维
    MySQL数据库的下载与安装
    MySQL数据库的发展历程
    Java中的数组(Array)
    break与continue关键字
  • 原文地址:https://www.cnblogs.com/cjing2011/p/acf60bf5e63691360058b169fa31ff5e.html
Copyright © 2020-2023  润新知