缓存穿透:访问一个不存在的key,导致直接访问DB,数据量很大时导致,数据库挂掉
解决方案
1、缓存空置,设置较短的过期时间,直接返回给请求端
2、采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
3、拦截器,id<=0的直接拦截
4、利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试
5、采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
缓存击穿:访问一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。
解决方案
(1)设置热点数据永远不过期。
(2)加互斥锁。
缓存雪崩:同一时间有大量请求,缓存中没有数据,导致直接存数据库中读取,大量请求导致拖垮数据库