缓存雪崩
举个栗子:如果所有首页的key失效时间都是晚上零点,中午12点刷新,我零点有个秒杀活动,每秒会进入大量的请求,在零点大量key失效,大量请求进入到数据库,数据库扛不住。真实情况可能DBA都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。这就是我理解的缓存雪崩。
解决方案
处理方法:把每个Key的失效时间都加个随机值就好了,保证数据不在同一时间大面积失效
缓存穿透
指缓存和数据库中没有的数据,而用户不断发起请求去查询它,数据库可能会崩溃
举个栗子:假设id都是从1自增上去的,如果请求id值为-1的数据,这是无限请求数据库,数据库就可能崩溃(这种加参数校验就行了)
解决方案
在接口层增加参数校验,不合法的直接返回
BloomFilter: 他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。
缓存击穿
缓存击穿是在某一时间一个非常热点的Key失效了,同时又有大量的请求这个热点Key,就好像在一面墙上砸出来了一个洞
解决方案
设置热点数据永远不过期。或者加上互斥锁就能搞定了
一般避免以上情况发生我们从三个时间段去分析下:
事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免 MySQL 被打死。
事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。