关键字: 缓存和数据库都没有
我的理解:缓存在此时形同虚设,请求直接透传到数据库中,所以叫穿透
频繁请求缓存和数据库中都没有的数据,因为从数据库中查询到任何数据,所以不会写入缓存,导致缓存失去作用,请求可以直接穿透透传到数据库,造成数据库巨大的压力,请求过大时DB可能就挂了。
解决方案:
2. 击穿接口层增加校验:用户登录鉴权、请求参数过滤(如ID<=0的请求直接过滤掉)等;
短时间缓存空数据:可以将数据库中不存在的数据短暂缓存起来,比如: key:null,缓存过期时间设置为30秒,这样可以一定程度上缓解恶意用户使用同一个key暴力攻击数据库
布隆过滤器
关键字:缓存无(过期),数据库有
我的理解:
此种场景有两个关键字:一个过期的key、高并发,重点在击这个字,被谁击,被高并发的请求击,就是一个已过期的key在同一时间点被高并发的请求所攻击,导致数据库的压力瞬间陡增,有挂掉风险。
在某一时刻,有大量并发请求打过来,它们同时去读缓存,缓存已过期没有获取到数据,然后又同时去数据库取数据,导致数据库压力陡增。
解决方案:解决掉两个关键字就可以解决问题
3. 雪崩热点数据的缓存有效期设置为永不过期 —— 解决过期的问题
接口层增加限流、熔断、降级处理 —— 解决高并发的问题
使用互斥锁:在查询数据库的时候加上互斥锁,保证同一时间只有一个线程可以 *** 作数据库 —— 解决高并发的问题
关键字:缓存无(过期),数据库有
雪崩=击穿的plus版(plus的地方是大量过期的key)
我的理解:
此种场景也是有两个关键字:大量过期的key、高并发,大量过期的key面对高并发的请求时,缓存失效,所有请求都打到数据库,导致数据压力瞬间陡增,有挂掉风险。
解决方案:也是解决掉两个关键字
热点数据的缓存有效期设置为永不过期 —— 解决过期的问题
过期时间随机化,尽量让过期时间均匀分布,避免同一时间存在大量过期的key —— 解决过期的问题
使用互斥锁:在查询数据库的时候加上互斥锁,保证同一时间只有一个线程或少量线程可以 *** 作数据库 —— 解决高并发的问题
先写这么多,后续有想到其他更多的方面,再做补充!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)