作者:上海十里红妆婚礼策划红_196 | 来源:互联网 | 2023-07-19 13:49
缓存穿透:key对应的数据在缓存和数据源都不存在,导致每次请求都会出现没有命中缓存,接着查询数据源,从而有可能压垮数据源。比如用一个不存在的用户id获取用户信息,在并发情况下就可能
缓存穿透:key对应的数据在缓存和数据源都不存在,导致每次请求都会出现没有命中缓存,接着查询数据源,从而有可能压垮数据源。比如用一个不存在的用户id获取用户信息,在并发情况下就可能压垮数据库。
解决思路:
1.用同一个不存在用户id去查询这种情况属于恶意请求,可以在nginx层根据ip做拦截。
2.对用户的请求参数加强过滤,比如id<1就return false。
3.缓存和数据都查不到时也可以给这个key设置一个null值,设置一个短一点的过期时间,比如30秒,也可以减少请求打到db上。
4.也可以结合布隆过滤器(Bloom Filter)对key做查询,如果返回没有 就一定没有,如果返回有 表示有可能有。
缓存击穿:某个热点key,在并发情况下正好缓存过期,导致大量请求没有命中缓存,接着查询数据库,虽然数据库是有数据的,但是大量请求情况下也可能出现压垮数据库。
解决思路:
1.根据情况可以设置热点key永不过期,配合定时任务更新cache,或者数据有更新再主动更新。
2.结合互斥锁处理
缓存雪崩:同一时间缓存大面试过期,会导致数据库在同一时间收到大量请求,可能出现压垮数据库。
解决思路:
1.分散过期时间,在设置缓存过期时间时加上一个随机的数字。
2.或者设置缓存永不过期,数据有更新再主动更新。