一,缓存穿透
1、描述:缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
如果有大量这种请求,数据库的压力会很大
2、解决方案
1)缓存空对象
把请求的数据设为空值存到缓存中
优点:①实现简单,维护方便
缺点:①额外的内存消耗②可能造成短期的不一致
2)布隆过滤
在客户端与缓存(Redis)中间加一层布隆过滤,在这里判断数据库中是否存在
优点:①内存占用较少,没有多余key
缺点:①实现复杂②存在误判可能
除此之外,还有增强id复杂度,避免被猜出id规律
做好数据的基础格式校验
加强用户权限校验
做好热点参数的限流
二,缓存雪崩
1、指在同一时间段大量缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力
2、解决方案
1)给不同的key的TTL添加随机值
2)利用Redis集群提高服务的可用性
3)给缓存业务添加降级限流策略
4)给业务添加多级缓存
三,缓存击穿
1、也叫热点key问题,就是一个高并发访问并且缓存重建业务比较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击
由于业务比较复杂,当该key失效后重新存入缓存的时间比较长
又因为并发高,这时会有很多请求同时未命中,增加数据库负担
2、解决方案
1)互斥锁:当一个请求未命中时,加锁然后更新缓存,别的请求等待,知道缓存更新完
优点:没有额外的内存消耗
能够保证一致性
实现简单
缺点:线程要等待,性能受影响
可能有死锁的风险
2)逻辑过期:不设置该热点key的TTL,而是加入一个关于过期的字段
当未命中时(逻辑过期),会有单独的一个线程更新缓存,
在没有更新完成时仍然使用旧数据
优点:①线程无需等待,性能较好
缺点:①不保证一致性
②有额外的内存消耗
③实现复杂