概述
请求1 Niginx 应用1 (pool)连接池不会设置太大
请求2 ----------> 应用2 --------------------------------> cache (主要是读操作)----> DB(硬盘)
请求3 应用3
cache是减轻DB压力。放在应用服务器的内存中。
查询是可以存在并发的,写数据是不能有并发的。
雪崩效应
并发太快,缓存。
问题:当第一个线程进入 查询DB,还没往缓存插入数据,其余的线程,开始进入,直接也去查DB。缓存失效的情况下,也会这样。或者是第一次进入。
解决方案: 在方法中加synchronized,重量级锁。缺点是效率低。而且在查询缓存的时候不应该把这个放在方法级别锁,在读取缓存时候还要排队是不合理的。
public synchronized List<Order> query(){
而应该放在具体的代码块:
synchronized(this){
List<Order> result=this.orderMapper.getAll();
ops.set(CACHE_KEY,JSON.toJSON(result),10,TimeUnit.MINUTES);
}
spring cache里有双重检查锁。
可以将代码模板化,解耦。缓存其实是与业务无关的东西,可以将其抽出来,做成模板。用模板来。
最后
以上就是文静信封为你收集整理的高并发下缓存穿透原理的全部内容,希望文章能够帮你解决高并发下缓存穿透原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复