问题描述解决方案
缓存穿透 查询一个不存在的数据,不能命中缓存,导致每次请求都要到DB去查询,可能导致数据库崩溃 1.查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短;
2.布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对DB的查询
缓存击穿 对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好有大量对这个key的并发请求,可能导致大量并发的请求瞬间把数据库压垮 1.使用互斥锁:当缓存失效时,先使用如Redis的setnx去设置一个互斥锁,当操作成功返回时再进行数据库操作并回设缓存,否则重试get缓存的方法;
2.永远不过期:物理不过期,但逻辑过期(后台异步线程去刷新)
缓存雪崩 设置缓存时采用了相同的过期时间,缓存在某一时刻同时失效,导致大量请求访问数据库。
与缓存击穿的区别:雪崩是多key,击穿是单key缓存
1.分散缓存失效时间:在原有的失效时间基础上增加一个随机值;
2. 使用互斥锁,当缓存数据失效时,保证只有一个请求能够访问到数据库,并更新缓存,其他线程等待并重试
posted on 2022-03-29 14:42  YLENOL  阅读(94)  评论(0)    收藏  举报