现象:原本稳定的环境突然奔溃,并在重启后又短时间奔溃,查看mysql也是奔溃,访问过多。 判断缓存失效或主要功能的缓存失效。
措施: 查看redis是否怠机,并查看key值数量是否大规模失效, 若是就是redis雪崩问题
缓存雪崩的事前事中事后的解决方案如下。
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存+ hystrix限流&降级,避免MySQL被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
用户发送一个请求,系统 A 收到请求后,先查本地ehcache缓存,如果没查到再查redis。如果ehcache和redis都没有,再查数据库,将数据库中的结果,写入ehcache和redis中。
限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,怎么办?走降级!可以返回一些默认的值,或者友情提示,或者空白的值。
好处:
数据库绝对不会死,限流组件确保了每秒只有多少个请求能通过。
只要数据库不死,就是说,对用户来说,2/5 的请求都是可以被处理的。
只要有 2/5 的请求可以被处理,就意味着你的系统没死,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来一次。
Redis穿透问题:
现象:mysql中某个查询和插入sql执行次数过多,并针对的是个别值,高并发时慢
解决措施:
1、设置布隆过滤器
原理就是一个对一个key进行k个hash算法获取k个值,在比特数组中将这k个值散列后设定为1,然后查的时候如果特定的这几个位置都为1,那么布隆过滤器判断该key存在。
布隆过滤器可能会误判,如果它说不存在那肯定不存在,如果它说存在,那数据有可能实际不存在;
代码:
先引入包,并查询时调用
缺点:布隆过滤器不支持删值操作,并需维护布隆过滤器
2、可以通过双重检测+锁, 抢到锁的才能查询设置