高并发下缓存穿透原理

请求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里有双重检查锁。


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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值