当前位置: 首页>后端>正文

通俗易懂的缓存雪崩,穿透,击穿以及如何防范

缓存雪崩:缓存大面积的在同一时间段过期。例如我在做秒杀前把页面都缓存了,但是在倒计时十秒的时候,页面缓存都失效了,本来缓存可以抗住5000的并发,结果这5000的并发都直接落入到了数据库,导致库直接崩了。
解决方案:不要为所有的缓存设置固定一样的失效时间,可以设置为随机的时间。

缓存穿透:指缓存中没有这个值,例如要查找的ID为null,但是我们库中没有此数据,但是恶意攻击一直在查null,所以一直在访问数据库,导致数据库崩烈。
解决方案:数据库id都是大于0的并且都不为null,可以以此做校验。或者在缓存当中缓存访问量比较高的查询数据,比如缓存null。还有一个就是使用布隆过滤器(Bloom Filter)他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。

缓存击穿:和缓存雪崩差不多,在某一时间一个热点的缓存过期了,导致高并发打入到数据库,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。
解决方案:最简单的方式设置热点数据不过期。

一般避免以上情况发生我们从三个时间段去分析下:
事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免 MySQL 被打死。
事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。


https://www.xamrdz.com/backend/3sb1924765.html

相关文章: