什么是Redis
Redis是nosql数据库,内存数据库,是利用内存对数据进行缓存,从而加快数据的存取速度,一般情况下,会将热点数据放入缓存,例如用户数据,权限数据,排行榜,更新频率低的报表数据等。
速度快的原因有三个:1.数据在内存 2.单线程 3.多路复用的I/O
Redis的数据结构与支持数据类型
key-value的键值对结构,支持string,list,set,zset,hash五种数据类型,每一种数据类型都有对应的命令操作。
Redis持久化
上面说到Redis的数据是存放在内存的,但也可以做持久化,只是持久化不是保存在数据库,而是本地硬盘中,在本地会生成dump.rdb文件,Redis的持久化可以开启可以不开启,默认开启,主要有两种模式RDB模式和AOF模式,简单来说前者是定时持久化,备份数据,后者是实时持久化,可以同时启用。
RDB
默认情况下,Redis会采取RDB模式定时备份数据,实际上是以生成快照的方式进行备份,每次都会将全量数据进行备份。
AOF
实时备份Redis数据,每一次Redis的数据变动都会触发备份,与RDB不一样的是AOF是增量备份,在原来备份的基础上追加数据,实际上AOF是将命令保存下来,在恢复的时候,全部重新执行一次,所以AOF会保存所有完整的操作日志。
优缺点比较:
1.数据可靠性:RDB是定时备份,无论如何必然会存在一些数据损失;AOF是实时的,每次操作都是实时记录,数据可靠性绝对是更高
2.容灾适用:RDB是以定时快照的形式备份,每次生成的是一个单文件,方便存放和归档,而且恢复的时候直接写入数据即可,没有额外的操作;AOF在恢复的时候是将保存的命令重新执行一遍,一条记录可能会有多个操作,恢复速度比较慢,也因此AOF的文件一般比RDB要大。
3.性能:其实一般情况下,两种模式在性能上都不会有很大差别,但是当数据量特别大的时候RDB由于是全量备份的,需要话费更多的时间进行备份,AOF是实时的,每次写入的数据不会太多。
一般情况下用于缓存的数据只是为了提高数据的读取速度,并非不可丢失,数据真正存储在数据库,所以即便在恢复的时候会造成部分数据丢失也不会对应用造成很大影响,相反,如果Redis崩溃后恢复的速度很慢,那么会降低应用的响应速度,所以一般情况下使用RDB足矣,当然如果存在AOF的备份,Redis在恢复的时候会首先使用AOF的备份进行恢复,因为数据更新更全。
Redis的缓存刷新机制
Redis的数据是会过期的,否则大量的数据放在内存对内存的消耗是很大的,对于缓存数据的刷新有三种机制:
1.超时淘汰
超时淘汰有两种方式,一种是定时过期,Redis会定时去扫描缓存的数据,如果发现数据已经超时了会将数据移除;第二种是惰性过期,当这个数据被访问的时候,发现已经超时了,会清除掉。
两种淘汰方式是同时存在的,如果只有定时过期,那么当数据量很大的时候,扫描的时间会变得很长,影响Redis处理请求;若只有惰性过期,当大量的数据都没有被再次访问的时候,这些数据会一直占用内存造成内存浪费。二者通常是一起使用,定时过期只会运行一定时间,例如每次只扫描1秒就停止了,剩下没扫描到的数据就等待惰性过期,这样相对合理。
2.主动刷新
就是手工主动去对数据进行刷新,例如每次保存都去刷新缓存
3.根据算法淘汰
Redis哨兵模式
为了保证Redis的可用,Redis一般是集群部署,会有主节点和从节点,主节点负责写处理,从节点负责读处理,一般来说缓存数据读多写少,当主节点挂掉之后,需要有新的主节点自动切换上去,这时候通过哨兵进行监控。
所谓哨兵从字面理解就是放哨的,用来做监控的,及时发现问题,在集群中除了主节点和从节点,还需要设置哨兵节点,一般是基数个,哨兵节点不会处理读写请求,只是专注于监视主节点,当哨兵监视到主节点挂掉了,会从从节点中选取一台作为主节点切换上去,继续监视。
监视的过程由三个定时任务完成:
1.获取当前情况:每隔10s,每个哨兵节点向所有主从节点获取当前最新的集群拓扑结构。
2.汇报情况:每隔2s,每个哨兵节点向同一频道汇报自己对于主节点的判断,同时获取其他哨兵节点的判断。
3.检查心跳:每隔1s,每个哨兵节点都ping一下所有的主从节点,看看是否可达
如何判断主节点挂掉了?
主观下线:在检查心跳的时候,如果该节点不可达,那么对于当前哨兵节点来说,该节点已经下线了,就是我觉得你挂掉了
客观下线:如果说超过半数的哨兵节点在检查心跳的时候发现主节点不可达,那么在汇报情况的时候,大家就可以公认主节点下线了。
通过主观下线与客观下线的综合判断,就可以判断主节点挂掉了,这时候会重新选举出新的节点作为主节点。
举例:比如说现在有几条道路,这些路都单向行驶的,其中有一条是作为主干道从东到西来行驶的,大家都从这里走,其他的都是从西到东,如果主干道坏掉了大家都没法走了,需要找另外的路来做主干道,这时候就需要有几个人负责定时检查道路的状况,首先每个人肯定都要知道当前道路的情况,到底有哪些路是可以走的,但是道路的情况是会变化的,那就需要隔一段时间去获取一下道路的地图,有了地图才好办事,下面就是定时去主干道看一下路通不通,但是只靠一个人的判断不准确,所有每个人都要去,然后作出自己的判断,最后大家都定时的将自己的判断发布到某个地方向所有人进行汇报,如果超过半数的人都觉得这个路走不了,那么大家就从剩下的道路中找一条作为主干道来走。