[一]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. React的setState执行机制

    1. setState基本特点 1. setState是同步执行的 setState是同步执行的,但是state并不一定会同步更新 2. setState在React生命周期和合成事件中批量覆盖执行 ...

  2. PowerDesigner 技巧【1】

    Name与Code同步的问题: PowerDesigner中,修改了某个字段的name,其code也跟着修改,这个问题很讨厌,因为一般来说,name是中文的,code是字段名. 解决方法如下: 1.选 ...

  3. saltstack:multi-master configuration

    官方手册地址:http://docs.saltstack.com/topics/tutorials/multimaster.html 总结起来,有以下几步: Create a redundant ma ...

  4. HDU3376 最小费用最大流 模板2

    Matrix Again Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)To ...

  5. HDU3585 最大团+二分

    maximum shortest distance Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  6. Selenium判断获取的元素是否可见(display:none)

    在爬虫中需要自动登陆并判断是否登陆成功,如果登陆错误的话还需要知道错误提示信息,此时需要判断提示信息是否可见 if self.element_exist_xpath('//*[@id="bu ...

  7. 洛谷 P3730 曼哈顿交易

    https://www.luogu.org/problem/show?pid=3730 题目背景 will在曼哈顿开了一家交易所,每天,前来买卖股票的人络绎不绝. 现在,will想要了解持股的情况.由 ...

  8. HDU 5942 Just a Math Problem 容斥 莫比乌斯反演

    题意:\( g(k) = 2^{f(k)} \) ,求\( \sum_{i = 1}^{n} g(i) \),其中\( f(k)\)代表k的素因子个数. 思路:题目意思很简单,但是着重于推导和简化,这 ...

  9. dp优化-四边形不等式(模板题:合并石子)

    学习博客:https://blog.csdn.net/noiau/article/details/72514812 看了好久,这里整理一下证明 方程形式:dp(i,j)=min(dp(i,k)+dp( ...

  10. 【BZOJ】1574: [Usaco2009 Jan]地震损坏Damage

    [算法]搜索 [题意]给定无向图,现在可能有一些点已经被删除,只给出信息是c个点不能到达结点1,求最少的不能到达结点1的个数(含已删除点). [题解] 真是一道奥妙重重的题目. 每个点不能到达结点1, ...