优点:
1.速度快
redis里面的所有数据都是存在内存中所以减少了操作数据对于IO磁盘的读写操作的限制,从而提高数据读取和操作的速度
redis在接受客户端请求的时候是属于单线程操作
使用I/O多路复用模型–后续补充说明
高效的数据结构–后续补充说明
2.支持多种数据类型
支持五种数据类型
3.支持事务
操作都是原子性,要么全部完成要么全部不完成
4.丰富的特性
可以用于缓存/消息/按照key设置过期时间,过期后会自动删除
redis里面一共是有16个数据库编号为0-15
数据类型
支持五种数据类型
String(字符串)
list(列表)
hash(哈希)
set(集合)
zset(有序集合)
持久化机制
RDB持久化
数据采用数据集快照的形式进行部分持久化模式,记录数据库的所有的键值对,在某一个时间点将数据写入的临时文件,持久化结束以后用这个临时文件替换上一次持久化的文件从而达到数据而定恢复但是这个存在数据丢失的现象
AOP持久化
是将所有的命令记录以redis的命令请求格式进行完全的持久化存储保存为aof文件,读的操作不进行记录
持久化方式 | RDB | AOF |
---|---|---|
占用存储空间 | 小(数据级:压缩) | 大(指令级:重写) |
存储速度 | 慢 | 快 |
恢复速度 | 快 | 慢 |
数据安全性 | 会丢失数据 | 依据策略决定 |
资源消耗 | 高/重量级 | 低/轻量级 |
启动优先级 | 低 | 高 |
redis过期键的删除策略
1.定时删除(时间换空间)
创建一个定时器,当key设置了有过期时间,当过期时间到达的手定时器任务就会立即执行对键的删除操作
优点:节约内存,到点就删除释放不必要的内存空间
缺点:CPU压力大会影响到redis服务器的吞吐量
2.惰性删除(空间换时间)
数据到达过期时间,不做处理,等待下次访问数据的时候,我们需要判断
1).未过期,返回数据
2)过期了,删除数据,返回不存在
优点:节约了cpu的性能,发现需要删除的时候才会删除
缺点:内存的压力比较大,出现长期占用内存的数据
3.定期删除
就是周期性的轮询redis数据库中的失效性数据,采取随机抽取的策略,你利用过期数据占比的方式控制删除的频率
cpu性能的占用设置有峰值,检测频率可自定义的设置
内存压力不是很大,长期占用的内存的冷数据会被持续清理
周期性抽查存储空间(随机抽查,重点抽查)----后续补充说明
redis的回收策略(淘汰策略)
三类八种
一.易失数据
1.volatile-lru
挑选最近使用最少的数据淘汰
2.volatile-lfu
挑选最近使用次数最少的数据进行
3.volatile-ttl
挑选将要过期的数据进行淘汰
4.volatile-random
任意选择数据进行淘汰
二.检测全库的数据
1.allkeys-lru:挑选最近最少使用的数据淘汰
2.allkeLyRs-lfu::挑选最近使用次数最少的数据淘汰
3.allkeys-random:任意选择数据淘汰,相当于随机
三.放弃数据驱逐
1.no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发OOM(Out Of Memory)
redis的同步机制是什么
主从复制
高并发/高性能/高可用
主从复制指的就是即将master中的数据及时有效的复制到slave中
一个master可以有多个slave,一个slave只对应一个master
主从复制的作用
1.读写分离:master写数据,slave读数据,提高服务器的读写负载能力
2.负载均衡:基于主从复制结构,配合读写分离,由slave分担master的负载,并且根据需求的变化,改变slave的数
3.故障恢复:当master出现问题的时候,由slave提供服务,实现快速的故障恢复
4.数据冗余:实现数据热备份,是一个持久化以外的一种数据冗余方式
5.高可用:基于主从复制,构建哨兵模式与集群,实现redis的高可用方案
主从复制三步
1.建立连接阶段从服务器主动与主服务器建立连接(建立连接阶段)
2.主服务器同步数据给从服务器(数据同步阶段)
3.主服务器反复的同步数据给从服务器(命令传播阶段)
1.建立连接
1.1.步骤一:设置master的地址和端口号保存master信息
1.2.步骤二:建立socket通道连接
1.3.步骤三:发送ping指令(定时器任务)
1.4.步骤四:身份验证
1.5.步骤五:发送slave端口信息
到此,主从连接成功
1.slave会发送指令:slaveof ip post(这里是指向的服务器端口和地址)给到master服务器
2.master接收到指令,响应slave
3.slave保存master的ip和端口号—masterhost/masterport
4.slave根据保存的信息创建连接master的socket
5.slave周期性的发送ping命令
6.master就会响应pong
7.如果redis设置了密码的情况下需要发起授权访问: auth password
8.master验证授权
9.slave 会发送指令:replconf listening-post < post-bumber >告诉master我的这个 post-bumber端口对外提供功能,你是用这个端口连接即可
10.master保存slave的端口号
主从连接
方法一:客户端发送命令
slaveof masterip masterport
方法二:启动服务器参数
redis-server -slaveof masterip masterpost
方法三:服务器配置--告诉指定的主服务器是谁
slaveof masterip masterport
断开连接再slave端输入指令
slaveof on one
数据同步阶段
步骤一:请求同步的数据
步骤二:创建RDB同步数据
步骤三:恢复RDB同步数据
步骤四:请求部分同步数据(复制缓存区)
1.slave发送指令:psync2 这一步实际上就是要求master给数据的
2.master首先将rdb执行一遍执行bgsave将数据存起来打包,然后创建一个复制缓存区(在第一个slave连接的时候就会创建),将生成的RDB文件通过socket通道发送给slave
3.slave接收RDB,清空数据,执行RDB文件恢复过程
4.slave发送指令告知master主RDB恢复已经完成了,你可以发送给我最新的指令了(最新的指令会放在复制缓存区)
5.master会发送复制缓存区的信息给slave
6.slave接收数据,执行bgrewriteaof,恢复数据
数据同步完成
命令传播阶段
哨兵
哨兵是一个分布式系统,用于对主从结构中的每一台服务器进行监控,当出现故障的时候通过投票机制选择新的master将所有的slave连接到新的master
作用:
1.监控:
不断的检查master和slave是否正常运行
master存活检测,master与slave运行情况检测
2.通知(提醒):
当被监控的服务器出现问题的时候,向其他的哨兵/客户端发送通知
3.自动故障转移:
断开master与slave的连接,选出一个slave作为master,讲其他的slave连接到新的master,并告知客户端新的服务器地址
如何配置哨兵
配置一拖二的主从结构
配置三个哨兵(配置相同,端口不同)
启动哨兵
redis-sentinel filename
哨兵的工作原理
阶段一:监控阶段(用于同步各个节点的状态信息)
1.获取其他各个哨兵的状态,是否在线
2.获取master的状态(info)(在拿到master的信息以后里面也是包含了这个下面的slave的一些基础信息)
3.根据2步骤获取到的slave的信息,获取所有的slave的状态
阶段二:通知阶段
1.就是哨兵会不停的访问获取对应的master/slave的状态信息,然后将得到的信息共享给其他的哨兵
阶段三:故障转移
1.哨兵A访问master的时候一直得不到反馈就会标记当前的master为下线的状态,并且告知其他的哨兵
2.其他的哨兵就会一起去访问master确认是不是已经下线了,这个时候只要有超过一般的哨兵判断是下线了就会标记为+odown,
3.哨兵里面开始进行选举
4.选举到的哨兵,首先排除不在线/响应慢/与原来的master断开时间长的的替换掉
5.先比较优先级/然后比较偏移量,偏移量大的优先,最后根据设备编号
缓存预热/雪崩/穿透/击穿
1.缓存预热
原因:请求数量过高/主从之间的吞吐量过高
方案:优先加载热点数据/利用分布式服务器同时进行数据的读取提速数据的加载过程/使用队列的形式进行/或者使用内容分发网络----后续进行补充说明
2.缓存雪崩
原因:在一个较短的时间出现大量的key过期了/访问缓存数据未命中进而访问数据库进而导致数据库同时接收到大量的请求无法及时的进行处理或者数据量的激增导致数据库直接崩溃
方案:设置过期时间的时候尽可能的将时间点分散,监控即将过期的数据进行判断是否需要进行延时处理作为热点数据,访问非常非常频繁的数据可以设置为永久进行处理,切换淘汰策略(如果是在lru和lfu的策略情况下具体的根据实际情况而定)
3.缓存穿透
指的是某个key过期了,但是这个key的访问量巨大/或者短时间redis对数据库发起了同一数据的大量访问
方案:设置热点数据的时间分配或者设置为永不过期的设置
二级缓存设置不同的失效时间
4.缓存击穿
出现大面积的访问未被命中或者出现非正常的url访问攻击
获取的数据再数据库里面不存在/返回的是null未进行持久化存储直接进行返回,出现恶意攻击服务器
方案:缓存null值对于查询的null值进行长期的使用或者进行定期淘汰策略/白名单策略/给设置的key添加规则,不满足规则的直接拒绝访问