必必须掌握的Redis知识点

须要明确的概念:redis

master(主服务器),slave(从服务器),sentinel(哨兵)数据库

redis持久化的两种方式:RDB和AOF缓存

RDB持久化是在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操做过程是fork(叉)一个子进程,先将数据集写入临时文件,写入成功后,再替换以前的文件,用二进制压缩存储。安全

优势:(1)文件备份只有一个文件,容易查找恢复;(2)灾难恢复效率高;服务器

缺点:(1)若是在定时持久化前出现宕机,数据将丢失;(2)RDB是经过fork子进程来协助完成持久化,若是数据集较大会致使服务器短期内中止服务架构

AOF持久化以日志的形式记录服务器所处理的每个写、删除操做,查询操做不会记录,以文本的方式记录,能够打开文件看到详细的操做记录。并发

优势:数据安全性更高,能够配置同步持久化异步

缺点:灾难恢复效率低分布式

 

主从复制原理高并发

主从多个redis集合在一块儿,以一个master多个slave为模式对外提供服务,配置master可读可写,配置slave提供读,这样就即能保证redis集群中的数据同步,又能够实现redis的读写分离,若是写比较多的状况通常就以异步的形式提供服务

redis主从复制能够根据是不是全量分为全量同步和增量同步

全量同步,通常发生在slave初始化阶段,这时slave须要将master上的全部数据都复制一份

增量同步,slave初始化后开始正常工做时主服务器发生的写操做同步到从服务器的过程,增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令

redis主从同步策略

主从刚刚链接的时候,进行全量同步;全同步结束后,进行增量同步。若是有须要,slave 在任什么时候候均可以发起全量同步。redis 策略是,不管如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步

注意:若是多个slave断线了,须要重启的时候,由于只要slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会致使Master IO剧增宕机

 

哨兵机制

哨兵是一个分布式系统,能够在一个架构中运行多个哨兵,该系统执行如下三个任务

监控:哨兵会不断地检查master和slave是否运行正常,只需配置主节点的监控便可,经过向主节点发送info,获取从节点的信息,并当有新的从节点加入时能够立刻感知

提醒:当被监控的redis出现问题时,哨兵经过API向管理员或其余程序发送通知

自动故障迁移:当一个master不能正常工做时,它会将失效master中的一个slave升级为新的master(这个master能够进行读写操做),并让失效master的其余slave改成复制新的master,当客户端试图链接到失效master时,集群也会向客户端返回新的master的地址,使得集群可使用master代替失效的master,若是以前的主服务器恢复,会自动跟随新选举出来的master成为slave

哨兵的工做方式:

每隔一秒哨兵会向它所知的master,slave以及其余哨兵发送一次ping命令作一次心跳检测,若是ping的时间超过指定值,哨兵节点则认为该节点错误或下线,主观下线

若是一个master被标记为主观下线,则监视这个master的全部哨兵都要以每秒一次的频率确认master的确进入了主观下线状态,当有足够数量的哨兵(大于配置文件的值)确认master进入主观下线状态,则master会标记为客观下线

 

缓存穿透及优化

缓存穿透是指查询一个不存在的key数据,因为缓存没命中须要从数据库查询,查不到数据则不写入缓存,这将致使这个不存在的数据每次请求都要到数据库去查询,流量大时DB会挂掉,这也是常常提的缓存命中率问题

解决:

1.若是查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴

2.在控制层对要查询的key进行校验,不符合则丢弃,而后再放行给后面的正常缓存处理逻辑

 

缓存击穿及优化

与缓存雪崩的区别在于这里针对某一key缓存过时,雪崩不少key

 

缓存雪崩及优化

缓存雪崩是因为大量的key设置了相同的过时时间,原有缓存失效,新缓存未到期间。全部请求都去查询数据库,而对数据库CPU和内存形成巨大压力,严重的会形成数据库宕机形成整个系统崩溃

为何设置过时时间:好比咱们在发送手机验证码的时候,将手机号做为redis key,验证码做为redis value存储在redis中,并设置过时时间为60秒,若是60秒的时间到了,懂了没?

解决:

1.通常并发量不是特别多的时候,使用最多的解决方案是加锁排队

2.高并发下给每个缓存数据增长相应的缓存标记,用来记录缓存的是否失效,若是缓存标记失效,则更新数据缓存

3.简单有效的方法:缓存失效时间分散开,好比咱们能够在原有的失效时间基础上增长一个随机值,好比1-5分钟随机,这样每个缓存的过时时间的重复率就会下降