第五课补充01——持久化

1、 多数据库,默认16个库;默认在0库;

2、 2种持久化机制:rdb(快照模式)、aof(日志模式)

(1) rdb持久化,2种方式:手动命令save和后台save

手动命令save会阻塞客户端的进程请求,直到save执行完成,因为redis本身是单线程的执行方式;

bgsave方式保存,是fork一个子进程来执行数据保存,

fork出的子进程进行bgsave的同时,父进程继续处理客户端的新请求,因此就涉及到新数据同步问题;父进程和子进程之间通过copy on write机制进行数据同步(主进程的数据量被子进程的数据量不一致时,才会copy on write)。

子进程是将数据写入到一个临时文件,然后通过原子性rename系统调用将临时文件重命名为rdb文件,因此,在任何时候出现故障,redis的rdb文件都是可用的。

持久化是写入磁盘,对磁盘IO影响比较大;

Redid支持rdb和aof一起持久化,但是调用bgsave命令或bgrewriteaof命令,同时只能有一个在执行,redis在执行存盘命令时,会检测当前是否已经有bgsave或bgrewriteaof在执行;

【测试——rdb快照模式】

RDB文件是二进制的,所以并不存在回车换行来分隔一行一行

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

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

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

【总结】

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

【测试——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内存。

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

紧接着上面测试

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

初,

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

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

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

初,

120s内change 1次的日志:

60s内change 2次的日志:

60s内change 1次,61s到120内再change 1次的日志:

60s内change 2次,61s到120内再change 1次的日志:

【总结】

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

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

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

建议stop-writes-on-bgsave-err false,就是bgsave出错时,前面请求继续,这样就是业务优先;

Dir ./是rdb文件或者aof文件的存储目录,如果同时采用两种持久化机制,磁盘竞争比较大;默认情况下rdb是开启的,想关闭rdb持久化,把save参数注销就可以了;

AOF存储格式:

Aof持久化方式,存储文件是根据数据库里的key,每个key生成一条日志,也就是不管执行多少次中间值变化,aof文件只存储最后的键值;

默认情况下是每秒刷入一次磁盘;

Always策略:一有变化就写入磁盘,数据丢失少,磁盘IO压力大;

Rdb和aof同时启用时,redis在加载数据前,优先加载aof文件

客户端执行aofrewriteaof重写命令后,会将命令同时发送到AOF缓冲区和AOFc重写缓冲区;

(1) aof缓冲区,存储执行重写命令产生的数据。也即是将键值保存成命令形式,先放在oaf缓冲区,再根据触发刷新到磁盘;

(2) aof重写缓冲区,是存储在重写过程中,客户端执行的新的命令。在子进程执行重写aof操作的过程中,父进程继续处理客户端发来的命令,同时将客户端的命令发生到aof重写缓冲区,等重写aof完成后,直接将aof重写缓冲区的命令直接追加到重写后的aof文件后面,这样保证整个重写过程的数据完整性;

(1)AOF重写,不会读取当前的aof文件,而是直接读取内存,将内存里的键值转换为命令,存在一个新的aof文件里;在重写过程中,会将客户端发来的命令存放在aof重写缓存里,aof重写结束后,将重写缓存里保存的命令追加到新生成的aof文件里;

(2)对于list这种会有很多元素的类型值,为了避免重写导致客户端输入缓冲区内存溢出,当处理列表  哈希表 集合 有序集合时,如果长度超过64个,则分成多个命令执行,64个通常是redis.h/REDIS_AOF_REWRITE_PER_CMD配置;

来自为知笔记(Wiz)

时间: 2024-08-09 22:03:07

第五课补充01——持久化的相关文章

第四课补充01——数据库系统的立体视图

数据库系统架构 一.数据库系统的分类:面向对象型.关系型.对象关系型 1.面向对象型数据库(OODBS) (1)面向对象型数据库系统是一种持久的.可共享对象库的存储器和管理器:是基于OO的思想,因此这类数据库也有封装.类.类层次等概念 (2)目前流行的开源面向对象数据库:DB4O 2.关系型数据库(RDBMS) (1)关系型数据库基于表的特性,方便用户使用查询语言SQL进行增删改查,目前流行的主流开源产品是MySQL 3.对象关系型数据库 (1)这个概念里保留了关系型数据库的结构,但允许关系表里

第六课补充01——主从复制原理,哨兵机制

[主从复制] 一. redis的复制 ## redis2.8版本后的复制机制,是采用增量复制的 ##复制过程:同步(全量or增量)——命令传播 1.同步流程: 2.全量同步过程: 3.增量同步过程: [哨兵机制] 简介 sentinel是redis高可用的解决方案,sentinel系统(N个sentinel实例,N >= 1)可以监视一个或者多个redis master服务,以及这些master服务的所有从服务:当某个master服务下线时,自动将该master下的某个从服务升级为master服

第三课补充01——set类型 sorted类型命令操作详解,redis管道及事务

1. set类型的命令操作: (1)sadd命令:向key指定的set集合添加成员 ##sadd命令:是设置set集合类型的数据,sadd  <key> <mumber> [<mumber>] ##<key>不存在的时候,sadd命令创建key并向集合添加成员: ##注意,成员之间空格分隔,如果用逗号,则表示是同一个成员 ##set集合里,member是不重复的 (2)smove命令:是原子操作,将指定的member从source移动到desitinatio

第二课补充01——redis-cli命令行详解、string类型、list类型、hash类型命令操作详解

一. redis-cli命令行参数 1.-x参数:从标准输入读取一个参数: [问题] [解决] 因为echo命令是默认带有回车\n的,不带回车需要echo –n命令: echo -n "haha"|redis-cli -x set name,从标准输入读入一个参数到redis,就不会有回车符: 2.-r参数:重复执行一个命令指定的次数: -i参数:设置命令执行的间隔: 例子:每隔1秒执行一次,一共执行3次info命令 3.-rdb文件:获取指定redis实例的rdb文件,保存到本地 可

第五课 Makefile文件的制作(补充)

序言: 前面的几节课讲解Makefile的一些基本知识也做了一些小例子实践了几下,那么到现在普通的练习则是没有问题.但是如果做项目文件较多又分层次等等还是会碰上好多问题的,这节课补充一些知识. 知识点: 1.makefile的内嵌函数: 2.二级目录的编写: 3.多级目录的编写: 原理: GNU make还提供了相关的函数来帮助我们编写此文件,使得我们在编写makefile文件时更加灵活健壮.提供的函数大致分为有:处理文件名.文本内容.变量.命令四种:在这节中不会讲太多的函数甚至连最基本的去空格

【Web探索之旅】第二部分第五课:响应式网站和移动应用

内容简介 1.第二部分第五课:响应式网站和移动应用 2.第三部分第一课预告:服务器 第二部分第五课:响应式网站和移动应用 在我们开始聊响应式网站之前,我们可以聊聊移动App(App是Application的缩写,意为"应用"). 自从触屏式手机和平板电脑开始流行起来后(多亏乔布斯乔老爷子推广了iPhone),传统的网站和软件行业发生了翻天覆地的变化.以前,我们用手机最多是打电话,发短信,玩游戏,很难得会在手机上浏览网页. 可是自从触屏技术开始流行后,大大提高了人们在手机和平板上&quo

Spark IMF传奇行动第18课:RDD持久化、广播、累加器总结

昨晚听了王家林老师的Spark IMF传奇行动第18课:RDD持久化.广播.累加器,作业是unpersist试验,阅读累加器源码看内部工作机制: scala> val rdd = sc.parallelize(1 to 1000) rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:21 scala> rdd.persist res0: rdd.type

【Linux探索之旅】第三部分第五课:延时执行,唯慢不破

内容简介 1.第三部分第五课:延时执行,唯慢不破 2.第三部分测验题 延时执行,唯慢不破 上一课(<[Linux探索之旅]第三部分第四课:后台运行及合并多个终端>)中,我们学习了后台进程以及如何在一个终端里打开多个虚拟终端. 到目前为止,我们所运行的命令都是立即执行,也就是我们按下回车键的那一刻,命令就开始执行了. 其实Linux中命令还可以延时执行.这一课我们就来学习几个命令,可以帮助我们<稍后>执行程序.比如我们即将学习到的crontab命令. 所有这一课新学的命令都涉及到时间

Adafruit的树莓派教程第五课:使用控制电缆

Adafruit的树莓派教程第五课:使用控制电缆 时间 2014-05-09 01:11:20 极客范 原文 http://www.geekfan.net/9095/ 主题 Raspberry PiMacOSLinux 本文由极客范-Boyd Wang翻译自 Adafruit.com .欢迎加入 极客翻译小组 ,同我们一道翻译与分享.转载请参见文章末尾处的要求. 概览 这节课你将学习到如何使用控制电缆控制你的树莓派. 用这种方式连接的一大好处是它可以直接为小派供电并且你也不需要连接键盘鼠标或显示