1.redis应用场景:
2.redis持久化:RDB和AOF
RDB是采用存储内存数据集快照的方式进行持久化,缺点:占用cpu和磁盘IO资源较大,会造成其他应用的服务卡顿,甚至宕机,出现丢失数据的风险较大(由这种持久化机制本身决定,60秒内多少个key发生变化进行一次,若没有出发,则会进行下一轮持久化判断查询,因此在两轮判断之间出现服务器宕机,丢失数据风险较大),优点:恢复速度较快。
AOF采用日志追加写入的方式。缺点:恢复速度慢,因为要将所有的指令重新执行一次。优点丢失数据的风险比较小,不会占用大量的cpu资源以及磁盘IO资源。
默认情况下RDB持久化方式开启,AOF默认未开启。
3.内存淘汰策略:
图片说明
内存不够用时出发内存淘汰策略。默认策略为报错模式。
带有volatile字的只针对与设置了过期时间的数据。Allkeys是对所有数据都执行淘汰策略。
4.Redis集群:
4.1主从复制:
图片说明
默认主节点宕机,从节点不能够自动替换主节点。
4.2哨兵模式:
图片说明
哨兵功能:监控,提醒,自动故障转移。
对哨兵采用集群的方式,实现高可用。
4.3redis集群:
图片说明
哈希槽共有16384个,多个主节点占用一定范围的哈希槽,往redis里面存值的时候,首先进行hash函数的计算,hash值对16384取模,得到某一个确定的hash槽,往指定的hash槽之中存储数据,取数据也要经过同样的运算。
5.redis缓存问题
5.1缓存穿透:查询了一个mysql数据库里没有的数据,多次请求都会访问多次mysql数据库,造成数据库压力过大。
图片说明
解决方式一:在redis缓存这个不存在的值,就可以减小mysql数据库的压力
解决方式二:布隆过滤器
5.2缓存击穿:redis中的热点数据过期,会发生缓存击穿
解决办法一:将redis中的热点数据过期时间设长
解决办法二:使用互斥锁机制来实现只进行一次mysql查询,其他请求线程都进行等待。
5.3缓存雪崩:大量redis数据出现集中过期失效。
解决办法:将数据分业务设置过期时间。不同业务的redis数据设置的过期时间不同,就能避免雪崩现象的发生。
6.布隆过滤器
使用场景:请求先查询redis,若没有就查询mysql。问题就在于直接查询mysql了。
实现方式,在进行mysql数据插入的同时,在布隆过滤器中记录数据库中有这个值,这样下次查询的时候先访问布隆过滤器,如果布隆过滤器没有,就没必要查询mysql了,减小mysql的压力。
布隆过滤器中的两个概念:
①:位数组(长度可以设置)
②:多个hash函数
图片说明
布隆过滤器的缺点:可以判断一个key一定不存在,但是不能够判断一个key一定存在
影响布隆过滤器误判因素:
①:位数组长度过小,误判操作可能更容易发生。
②:hash函数的个数尽可能的多,判断一个数据是否在mysql中的条件就越苛刻,就越能够避免误判操作。