高并发下缓存穿透原理

请求1      Niginx    应用1   (pool)连接池不会设置太大

请求2 ---------->  应用2  --------------------------------> cache (主要是读操作)----> DB(硬盘)

请求3                    应用3


cache是减轻DB压力。放在应用服务器的内存中。

查询是可以存在并发的,写数据是不能有并发的。

雪崩效应

并发太快,缓存。

问题:当第一个线程进入 查询DB,还没往缓存插入数据,其余的线程,开始进入,直接也去查DB。缓存失效的情况下,也会这样。或者是第一次进入。

解决方案: 在方法中加synchronized,重量级锁。缺点是效率低。而且在查询缓存的时候不应该把这个放在方法级别锁,在读取缓存时候还要排队是不合理的。

public synchronized List query(){

而应该放在具体的代码块:

synchronized(this){
			List result=this.orderMapper.getAll();
			ops.set(CACHE_KEY,JSON.toJSON(result),10,TimeUnit.MINUTES);
		}

spring cache里有双重检查锁。


可以将代码模板化,解耦。缓存其实是与业务无关的东西,可以将其抽出来,做成模板。用模板来。





你可能感兴趣的:(高并发下缓存穿透原理)