缓存穿透
项目中使用缓存通常是先检查缓存中是否存在,如果存在就直接返回缓存中的内容,如果不存在就请求数据库,然后缓存返回的结果。
但是如果我们请求的数据如果在缓存中一直不存在,就会造成成每一次请求都请求DB,
这样缓存就失去了意义,在流量大的时候,db就可能挂掉。
要是有人利用不存在的key频繁攻击我们的应用,就存在漏洞了。
解决方案:
(1)缓存空对象,设置短暂的过期时间。
(2)布隆过滤器拦截
缓存击穿
在高并发的情况下,如果一个热点缓存失效了,可能出现多个进程同时查询db,同时设置缓存的情况。如果并发确实很大,这就可能造成db压力过大,还有缓存频繁更新的问题。
解决方案:
添加锁,尽可能减少多个线程去访问db。
缓存雪崩
高并发的情况下,平时我们设定一个缓存的缓存的过期时间时,可能会设置一分钟、5分钟,并发情况下很可能会在某一时间同时生产了很多缓存,并且过期时间都相同,当过期时间到了之后,这些缓存同时失效,请求全部转发到DB,DB压力可能就会过大。
解决方案:
随机过期时间,降低重复率。