1.1缓存穿透
概念:请求的数据在缓存和数据库中均不存在,导致所有的请求都直接到达数据库,从而导致数据库压力增大。
经典场景:
无效请求:用户请求的数据在数据库中不存在
恶意攻击:发送大量不存在的请求
解决方案:
-
缓存空数据,查询返回的结果为空,仍把这个空结果缓存
优点:简单
缺点:消耗内存;当数据更新时,查询数据不一致
-
布隆过滤器,拦截不存在的数据,不存在,直接返回
存储数据:在一个以二级制为单位的数组中,布隆过滤器可以检索一个元素是否在一个元素中(通过多个hash函数获取hash值,在对hash值进行计算数组对应的位置改为1,数组数据初始化都为0)
查询数据:使用相同的hash函数获取hash值,判断对应位置都为1
优点:内存占比少,没有多余的key
缺点:实现复杂,存在误判(误判率:数组越大,误判率越小,但是内存消耗越大)(不存在的数据在进行hash函数获取hash值时,取得位置与存在数据重合)
1.2缓存击穿
概念:某一或少量key过期,在这个时间点对这个key有大量的并发请求,这些请求直接到达数据库,可能压垮DB
解决方案:
1.互斥锁,查询缓存未命中时,获取互斥锁,在此线程完成数据重建,写入缓存,释放锁。
优缺点:强一致,性能差
2.逻辑过期,查询缓存时,逻辑时间过期,获取互斥锁并开启新线程,在新线程中进行数据重建以及重置逻辑过期时间,在原线程中依旧返回旧数据,直至新线程释放锁,才获取新数据(数据重建的数据)。
优缺点:高可用,性能优,不能保证数据绝对一致
注意:逻辑过期并不是数据真的消失,只是逻辑上的过期
1.3缓存雪崩
概念:在同一时间大量的key请求失效或者服务器宕机,导致请求全部到达数据库
解决方案:
1.给不同的key设置随机TTL
2.给业务添加多级缓存或添加限流机制