缓存雪崩:
- 场景:某个峰值有每秒5000次的请求过来,原本是用缓存抗其中的4000的请求,此时缓存宕机了,所有的请求,都请求到数据库了,导致数据库也挂了.
- 解决方案:
- -事前:保证rdeis集群高可用,主从+哨兵,redis cluster,避免全盘崩溃.
- 事中:本地ehcache缓存+hystrix或者sentinel限流&降级,避免MySQL宕机.
- -用户发送请求,接收到请求先查本地缓存ehcache,如果没有再查redis缓存,都没有再去查询数据库.最后将数据库结果写入ehcache和redis.
- -假设高峰有每秒5000请求,此时缓存雪崩了,先走本地缓存ehcache,如果本地缓存没有,则通过限流组件走数据库,限流每秒2000请求通过限流组件进入数据库,剩下的3000则走降级策略,通过降级策略可以给用户一些友情提醒,例:网络繁忙,请稍后重试.从而保证大量的请求不会压垮数据库.保证了一部分用户还是可以使用系统的.
- 事后:rides持久化,快速恢复缓存数据.
缓存穿透:
- 场景:
- -每秒5000个请求过来,其中4000个请求是恶意攻击的,这4000个请求都是数据库中不存在的.请求过来先走本地ehcache没有,接着走redis也没有,走数据库同样是没有,所以也不存在从数据库查询出来写入缓存的操作了.每秒的请求都直接通过数据库了那么数据库肯定宕机.
- 解决方案:
- -数据库查询不到数据时,也往redis写入,例查询id=-100的数据没有,则往redis写入set -100,unknown,并设置过期时间.这样下次恶意攻击过来还是查询这条数据,就会直接把unknown返回回去.
- -布隆过滤器(怎么使用自行百度),