缓存穿透、击穿、雪崩
穿透
记录——大量查询,缓存中没有记录且数据库中也没有记录,请求绕过缓存,打到DB上,MySQL并发连接1k左右,将会冲垮DB...
原因:缓存服务器故障、用户恶意请求
解决方案:
-
增加校验,拦截非法请求
-
缓存 key <——> null 减少大量空对象的缓存,有效时间设短些、防同一用户暴力攻击
-
布隆过滤、提前拦截
-
建立数据标识仓库:数据映射Hash值,然后将Hash值存到Redis中!可能出现部分数据Hash相同、而需要落到DB查询!
Bloom Filter 扩展:
当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。
击穿
缓存中没有数据库中有,原本缓存服务器存在这个key,在请求到来前恰好失效,那么多这个key的请求会落到DB上,称之为缓存击穿!
解决方案
-
热点数据不过期
-
加互斥锁(仅允许一个用户去DB查询,其他等待!拿到后写入缓存,其他用户再取缓存中的数据)
雪崩
一段时间内大量cache失效,大量查询失效的cache直接落到DB,导致数据库性能降低,压力骤增或者宕机!
原因: redis重启;缓存设置了相同的过期时间
解决方案
-
合理的规划缓存失效时间
-
搭建redis集群,保证高可用
-
对DB控制并发访问
-
多级缓存
-
快速失败的熔断策略,减少 DB 瞬间压力;