[一]redis的数据为什么要持久化
--->redis的存取数据性能高,是由于将所有数据都存储在内存中。当redis重启的时候,存储在内存中的数据就容易丢失。
--->把redis作为数据库使用。
--->把redis作为缓存服务器,但缓存被穿透后会对性能造成很大的影响,所有缓存同时失效会导致缓存雪崩,从而使服务无法响应。
--->因此我们希望redis能将数据从内存中以某种形式同步到硬盘,使得重启后可以根据硬盘中的纪录恢复数据,这一过程就叫做持久化
 
[二]redis的持久化,支持两种方式。
--->第一种:RDB方式:前者根据指定的规则,“定时”将内存中的数据存储在硬盘上。
--->第二种:AOF方式:每次执行命令后,将命令本身纪录下来。
--->两种持久化的方式可以单独使用其中一种,单更多情况下是二者结合使用
 
[三]RDB方式
--->前者根据指定的规则,“定时”将内存中的数据存储在硬盘上。
--->RDB方式的持久化是通过快照完成的,当符合一定条件时,redis会自动将内存中的所有数据生成一份副本并存储在硬盘上。这个过程就叫做:快照。
--->如果redis突然宕机,RDB快照只能恢复到最后一次快照的数据,而不能恢复到宕机前最后一刻的数据。因此要配合使用AOF方式进行数据持久化。
 
--->redis会在以下集中情况对数据进行快照。
(1)根据配置规则进行快照。
(2)用户执行SAVE或BGSAVE。
(3)执行FLUSHALL命令。
(4)执行复制时。
 
==>用户配置规则快照
(1)快照条件可以由用户在配置文件中自定义。由两个参数构成:时间窗口M和改动键的个数。
(2)意思就是每当时间M内被更改的键的个数大于N的时候,即符合自动生成快照。
(3)格式 save [seconds] [changes] 
(4)条件可以配置多个,条件和条件之间是或的关系
 
==>用户执行SAVE或者BGSAVE命令
&手动执行SAVE命令
(1)当服务重启,手动迁移以及备份时,我们也需要手动执行快照操作
(2)当手动执行save命令时,redis同步进行快照操作,在快照执行的过程中会阻塞所有来自客户端的请求。
(3)当数据库中数据比较多的时候,这一过程会导致Redis较长时间不响应。所以要尽量避免在生产环境中使用这一个命令
 
&手动执行BGSAVE命令
(1)需要手动执行快照推荐使用BGSAVE命令
(2)BGSAVE命令可以在后台异步地执行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。
(3)如果想知道快照是否完成,请执行LASTSAVE命令获取最近一次成功执行快照的时间。返回Unix时间戳
 
 
===>执行FLUSHALL命令
(1)当执行FLUSHALL命令时,redis会清除数据库中所有的数据。需要注意的是,不论清空数据库过程是否出发了自动快照条件,只要自动快照条件不为空,Redis就会执行一次快照。
(2)如果配置文件中没有设置自动快照的条件,执行FLUSHALL命令,不会执行快照,而是直接清空redis内存中的数据。
(2)执行FLUSHALL命令,底层是先触发了自动快照,自动快照完成,再清空数据库。
 
 
===>执行复制时
(1)设置主从模式时,Redis会在复制初始化时进行自动快照。
(2)当执行复制操作的时候,即使没有定义自动快照条件,并且没有手动执行快照操作。也会生成RDB快照文件
 
 
 
===>快照的过程
(1)Redis使用forx函数复制一份当前进程(父进程)的副本(子进程)
(2)父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写出硬盘的临时文件
(3)当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成
===>快照的原理。
(1)快照执行fork函数进行快照中,操作系统(类unix)会采用写时复制策略(copy-on-write).开启的子进程和父进程共享redis存储的数据。子进程(快照进程)往硬盘的临时文件里写数据。
(2)在fork函数执行中,有客户端想修改数据,操作系统则会对要修改的数据复制一份用于客户端修改。
(3)因此在快照时,redis的占用内存不会翻倍,但修改的数据块较多的时候,就会使得占用内存暴增,甚至翻倍,超过物理机的内存。
(4)向物理机申请额外内存。可通过修改操作系统配置文件。修改/etc/sysctl.conf文件,在文件中加入vm.overcommit_memory=1,然后重启系统或者执行sysct1 vm。overcommit_memory=1.当物理内存满的时候,liunx系统允许应用程序申请超过可用内存(物理内存+交换分区)的空间。
 
 
 
[四]AOF方式
--->每次执行命令后,将命令本身纪录下来。
--->当使用Redis存储非临时数据时,一般需要打开AOF持久化来降低进程中止导致的数据丢失。
--->AOF可以将Redis执行的每一条命令追加到硬盘文件中。这一过程,显然会降低redis的性能,单大部分情况下这个影响是可以接受的。例外使用较快的硬盘可以提高AOF的性能
--->默认情况下Redis并没有开启AOF(append only file)方式的持久化,可以修改配置文件参数为:appendonly yes.  生成的持久化文件名字为  appendfilename "appendonly.aof"
---> AOF持久化文件的存储路径和RDB的文件路径一样,通过配置文件中的dir参数配置
--->为了防止AOF文件的过大和记录的命令冗余。每当达到一定条件的时候,redis就会自动重写AOF文件,这个条件在配置文件中可以配置
  #auto-aof-rewrite-percentage 100  #当目前的aof文件大小超过上一次重写时aof文件大小的百分之多少时会再次重写。
  #auto-aof-rewrite-min-size 64mb  #允许重写的最小aof文件的大小
--->操作系统存在缓存机制,其实每次要写往硬盘的数据,其实都是先写入操作系统缓存。然后操作系统的缓存每30秒往硬盘写一次数据。
  1. # appendfsync always   #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
  2. appendfsync everysec     #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
  3. # appendfsync no    #完全依赖os,性能最好,持久化没保证  ,交由操作系统每30秒往硬盘刷写一次。
 

redis之(十二)redis数据的持久化的更多相关文章

  1. WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)

    原文:WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济 ...

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

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

  3. Redis(十二)flush误操作、Redis安全、处理bigkey和寻找热点key

    一.flushall/flushdb误操作的处理 假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000. 1.缓存与存储 被误操作flush后,根 ...

  4. redis深入学习(二)-----redis配置文件、持久化

    redis配置文件 地址 units单位 a  配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bitb  对大小写不敏感 GENERAL通用 1.daemonize 2.pidf ...

  5. Redis进阶实践之十二 Redis的Cluster集群动态扩容

    一.引言     上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境.当然,大家可以使用 Cluster info 命令查看Cl ...

  6. Redis 详解 (二) redis的配置文件介绍

    目录 1.开头说明 2.INCLUDES 3.MODULES 4.NETWORK 5.GENERAL 6.SNAPSHOTTING 7.REPLICATION 8.SECURITY 9.CLIENTS ...

  7. Scrapy 框架(二)数据的持久化

    scrapy数据的持久化(将数据保存到数据库) 一.建立项目 1.scrapy startproject dushu 2.进入项目 cd dushu 执行:scrapy genspider -t cr ...

  8. Redis教程(十二):服务器管理命令总结

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/140.html 一.概述: Redis在设计之初就被定义为长时间不间断运行 ...

  9. 分布式系列十二: Redis高级主题

    持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同步内存的数据到磁盘.文件 ...

  10. Redis(十二):redis请求转发的实现

    请求转发一般的原因为: 1. 该请求自身无法处理,需要转发给对应的服务器处理: 2. 为实现负载均衡,使用路由服务,选择目标实例进行转发: 在集群模式下,请求可以打到任何一台redis服务器上.然而并 ...

随机推荐

  1. HDOJ.2187 悼念512汶川大地震遇难同胞——老人是真饿了(贪心)

    悼念512汶川大地震遇难同胞--老人是真饿了 点我挑战题目 题目分析 每组数据给出所拥有的钱数,和大米的种类.每种大米给出单价(每单位重量)和大米的重量.求能买到的大米最大重量是多少? 采用贪心算法. ...

  2. MongoDB:删除操作

    一. 根据查询条件删除文档 查询 id=1 的所有文档 test:PRIMARY> db.test_1.find({id:1}) { "_id" : ObjectId(&qu ...

  3. [转载][mysql]mysql字符集干货

    源地址:http://www.blogjava.net/zyskm/archive/2013/04/09/361888.html 字符集的概念大家都清楚,校对规则很多人不了解,一般数据库开发中也用不到 ...

  4. python读书笔记-django架站过程总结(from the django book)

    django架站过程总结:1.django-admin startproject store2.store这个project的目录下有:__init__,manage,setting,urls3.se ...

  5. template.js的使用心得

    template.js是一款JavaScript模板引擎,用来渲染页面的. 原理:提前将Html代码放进编写模板 <script id="tpl" type="te ...

  6. HDU 5869 Different GCD Subarray Query 树状数组+离线

    Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...

  7. 2015/9/9 Python基础(10):文件和输入输出

    文件对象文件对象不仅可以用来访问普通的磁盘文件,而且也可以访问其它任何类型抽象层面上的“文件”.一旦设置了合适的“钩子”,你就可以访问文件类型接口的其它对象,就好像访问的是普通文件一样.文件对象的处理 ...

  8. Chrome浏览器启动页被360导航篡改解决方法

    右键Chrome浏览器快捷方式,选择“属性”,在“目标”的结尾处有添加的网址,删了即可. 2 如果在结尾处没有任何网址,可以添加“ -nohome”,这样下次启动时,就会打开一个空白页,也就不会打开被 ...

  9. 「6月雅礼集训 2017 Day4」暴力大神hxx

    [题目大意] 给出一个n重循环,每重循环有范围$[l, r]$,其中$l$,$r$可能是之前的变量,也可能是常数.求循环最底层被执行了多少次. 其中,保证每个循环的$l$,$r$最多有一个是之前的变量 ...

  10. 【NOIP】提高组2015 运输计划

    [题意]n个点的树,m条链,求将一条边的权值置为0使得最大链长最小. [算法]二分+树上差分 [题解] 最大值最小化问题,先考虑二分最大链长. 对所有链长>mid的链整体+1(树上差分). 然后 ...