redis持久化以及集群
redis提供了两种持久化策略:RDB与AOF
RDB
RDB的持久化策略: 按照规则定时将内存的数据同步到磁盘
snapshot(按照快照方式完成,当条件符合redis某一种规则,将内存数据写入磁盘)
redis在指定的情况下会触发快照,主要有如下几种方式:
快照存储在bin目录下的dump.rdb中(在某一状态下内存数据存磁盘)
1.自己配置的快照规则:redis.conf中配置
save <seconds> <changes>
save 900 1 当在900秒内被更改的key的数量大于1的时候,就执行快照
save 300 10
save 60 10000
2.save或者bgsave
save: 执行内存的数据同步到磁盘的操作,这个操作会阻塞客户端的请求
bgsave: 在后台异步执行快照操作,这个操作不会阻塞客户端的请求
3.执行flushall的时候
清除内存的所有数据,只要快照的规则不为空,也就是第一个规则存在。那么redis会执行快照
4.执行复制的时候
快照的实现原理
1:redis使用fork函数复制一份当前进程的副本(子进程)
2:父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
3:当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。
注意:redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。
这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份, RDB文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。
RDB的优缺点
缺点:使用RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。
这个时候我们就需要根据具体的应用场景,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受范围。
如果数据相对来说比较重要,希望将损失降到最小,则可以使用AOF方式进行持久化
优点:RDB可以最大化Redis的性能,父进程在保存RDB文件时唯一要做的就是fork出一个子进程,
然后这个子进程就会处理接下来的所有保存工作,父进程无序执行任何磁盘I/O操作。
同时这个也是一个缺点,如果数据集比较大的时候,fork可以能比较耗时,造成服务器在一段时间内停止处理客户端的请求;
AOF
AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这一过程显然会降低Redis的性能,
但大部分情况下这个影响是能够接受的,另外使用较快的硬盘可以提高AOF的性能
实践
1.修改redis.conf中的appendonly yes ;
2.重启后执行对数据的变更命令, 会在bin目录下生成对应的.aof文件, aof文件中会记录所有的操作命令
3.如下两个参数可以去对aof文件做优化
auto-aof-rewrite-percentage 100
表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。
4.如果之前没有重写过,以启动时aof文件大小为准
auto-aof-rewrite-min-size 64mb
限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化
基础
默认情况下Redis没有开启AOF(append only file)方式的持久化,
可以通过appendonly参数启用,在redis.conf中找到 appendonly yes
开启AOF持久化后每执行一条会更改Redis中的数据的命令后,Redis就会将该命令写入硬盘中的AOF文件。
AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,
默认的文件名是apendonly.aof. 可以在redis.conf中的属性 appendfilename appendonlyh.aof修改
aof重写的原理
Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。
整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,
即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,
并开始对新 AOF 文件进行追加操作。AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存,
因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松
同步磁盘数据
redis每次更改数据的时候, aof机制都会讲命令记录到aof文件,
但是实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入硬盘缓存。再通过硬盘缓存机制去刷新到保存到文件
# appendfsync always 每次执行写入都会进行同步 , 这个是最安全但是是效率比较低的方式
appendfsync everysec 每一秒执行
# appendfsync no 不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式
aof文件损坏以后如何修复
服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt),
那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。
当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:
1.为现有的 AOF 文件创建一个备份。
2.使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复。
redis-check-aof --fix
重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。
RDB 和 AOF ,如何选择
一般来说,如果对数据的安全性要求非常高的话,应该同时使用两种持久化功能。
如果可以承受数分钟以内的数据丢失,那么可以只使用 RDB 持久化。
有很多用户都只使用 AOF 持久化, 但并不推荐这种方式:
因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快 。
两种持久化策略可以同时使用,也可以使用其中一种。如果同时使用的话, 那么Redis重启时,会优先使用AOF文件来还原数据
集群
1.复制(master、slave)
slave只读,master来写入数
配置过程
将三台服务器中的redis.conf文件修改如下:注释掉bind 127.0.0.1,将daemonize no改为yes,将protected-mode yes改为no
修改slave服务器一和slave服务器二下的redis.conf文件,增加slaveof masterip masterport //slaveof master的ip地址 端口号
重启进入控制台通过info replication命令可以看配置参数
实现原理
1.slave第一次或者重连到master上以后,会向master发送一个SYNC的命令
2.master收到SYNC的时候,会做两件事
a) 执行bgsave(rdb的快照文件)
b) master会把新收到的修改命令存入到缓冲区
缺点
没有办法对master进行动态选举
复制的方式
1.基于rdb文件的复制(第一次连接或者重连的时候)
2.无硬盘复制 操作redis.conf内的repl-diskless-sync no来实现
3.增量复制 PSYNC master run id
2.哨兵机制
将解压文件下的sentinel.conf配置文件copy到安装的redis目录下,修改相关参数配置(暂无)
作用:
1.监控master和salve是否正常运行
2.如果master出现故障,那么会把其中一台salve数据升级为master
3.集群(redis3.0以后的功能)
redis密码设置:redis.conf中配置 requirepass foobared
bind:白名单,允许哪个ip访问
redis缓存更新:
1.先删除缓存,再更新数据库(在没有更新数据库之前,但是缓存已删除,查询会直接查数据库会产生脏数据)
2.先更新数据库,更新成功后再让缓存失效(低概率产生脏数据)
3.更新数据的时候只更新缓存不更新数据库,然后同步异步去批量更新数据库
(性能提高,数据的IO走缓存不走数据库,直接操作内存,但是数据也不是强一致)
缓存穿透:
条件:是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。
如果数据库查询对象为空,则不放进缓存。
场景:(如果查询一定不存在的对象。就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。)
1.对每个数据都设置一个对应的key值,key值不对不走数据库
2.布隆过滤器
缓存击穿:(缓存在高并发场景下同时失效,数据库压力过大)
1.互斥锁(用redis提供的setnx提供一个锁,让请求排队,后面如果能从redis中get出数据继续走缓存)
redis持久化以及集群的更多相关文章
- Redis 3.0 集群搭建
Redis 3.0 集群搭建 开启两个虚拟机 分别在两个虚拟机上开启3个Redis实例 3主3从两个虚拟机里的实例互为主备 下面分别在两个虚拟机上安装,网络设置参照codis集群的前两个主机 分别关闭 ...
- Redis 高可用集群
Redis 高可用集群 Redis 的集群主从模型是一种高可用的集群架构.本章主要内容有:高可用集群的搭建,Jedis连接集群,新增集群节点,删除集群节点,其他配置补充说明. 高可用集群搭建 集群(c ...
- Redis进阶实践之十 Redis主从复制的集群模式
一.引言 Redis的基本数据类型,高级特性,与Lua脚本的整合等相关知识点都学完了,说是学完了,只是完成了当前的学习计划,在以后的时间还需继续深入研究和学习.从今天开始来讲一下有关Re ...
- Redis进阶实践之十一 Redis的Cluster集群搭建
一.引言 本文档只对Redis的Cluster集群做简单的介绍,并没有对分布式系统的详细概念做深入的探讨.本文只是提供了有关如何设置集群.测试和操作集群的说明,而不涉及Redis集群规范中涵 ...
- redis整合Spring集群搭建及业务中的使用
1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...
- Redis+Twemproxy+HAProxy集群(转) 干货
原文地址:Redis+Twemproxy+HAProxy集群 干货 Redis主从模式 Redis数据库与传统数据库属于并行关系,也就是说传统的关系型数据库保存的是结构化数据,而Redis保存的是一 ...
- redis的哨兵集群,redis-cluster
#主从同步redis主从优先1.保证数据安全,主从机器两份数据一主多从2.读写分离,缓解主库压力主redis,可读可写slave身份,只读 缺点1.手动主从切换假如主库挂了,得手动切换master ...
- Redis实战——redis主从复制和集群实现原理
出自:https://blog.csdn.net/nuli888/article/details/52136822 redis主从复制redis主从配置比较简单,基本就是在从节点配置文件加上:slav ...
- redis之(十七)自己实现redis的cluster集群环境的搭建
[一]创建不同节点的配置文件和目录.并将配置文件中的port,cluster-enable,daemonize项做修改. --->port:修改成redis实例对应的端口号 --->clu ...
随机推荐
- ubuntu 12.04修改环境变量PAT…
这里我只针对ubuntu 12.04进行了测试,由于不同的linux发行版本可能会有一些地方不一致,所以对于其他的linux发行版仅供参考. 1.直接在命令行里添加 我们先来看下下PATH的值 ec ...
- 【原】Zookeeper 概述 + 官网 Overview 翻译
分布式应用 分布式应用 distributed application可以在给定时间(同时)在网络中的多个系统上运行,通过协调它们以快速有效的方式完成特定任务. (a), (b): a distrib ...
- Project Browser & Inspector
[Project Browser] You can drag items from the project structure list to the Favourites and also save ...
- 当property遇上category
[当property遇上category] @property可以在类定义中,以及extension定义中使用,编译器会自动为@property生成代码,并在变量列表(ivar_list_t)中添加相 ...
- 关于 pycharm 安装第三方模块的一些经验
解决pycharm问题:module 'pip' has no attribute 'main' 更新pip之后,Pycharm安装package出现报错:module 'pip' has no at ...
- rsa 数学推论
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化 而生动的描述,使得高深的数学理论能够被容易地理解.我们 ...
- boost 时间与日期处理
博客转载自: 类 特点 缺点 说明 timer 计时基类 不适合大跨度时间 适用大部分的普通计时 progress_timer 继承自timer 可以自动写入流中 只精确到0.01s 如果需要更精确, ...
- Luogu 4781 【模板】拉格朗日插值
模板题. 拉格朗日插值的精髓在于这个公式 $$f(x) = \sum_{i = 1}^{n}y_i\prod _{j \neq i}\frac{x - x_i}{x_j - x_i}$$ 其中$(x_ ...
- Requests接口测试(三)
一.定制请求头 我们先来看一下,关于请求头的定制演示,相信了解http协议的小伙伴应该对请求头部headers请求头部并不陌生,那么作为实际工作中的我们,如果想自定义一些请求头的信息,我们应该怎么办呢 ...
- qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用(转)
原则上,两者是不可以同时存在的,但是如果都安装了,该如何分别使用他们呢? Qt4 Visual Studio Add-in:官网可以下载安装程序,qt-vs-addin-1.1.11-opensour ...