先更新数据库还是先清缓存的问题

1:先删缓存再更新数据库

情况1:数据库和缓存内容不一致
线程1删除缓存后还没有来得及更新数据库时
线程2读缓存,由于缓存中的数据已经被线程1清空了所以线程2需要去数据库读数据,然后把读到的结果保存到缓存中。
此时线程1更新更新数据库成功。就会出现数据库和缓存内容不一致。
情况2:缓存击穿,数据库卡死
线程1删除缓存后还没有来得及更新数据库时
此时来了大量的读请求,由于缓存中没有数据,导致缓存击穿直接将大量请求访问到数据库,导致数据库崩溃。

2:先更新数据库后清缓存

情况1:缓存击穿,数据库卡死
线程1更新数据库后删除缓存。
此时有大量请求访问。导致缓存击穿,数据库卡死。

单点架构 建议优化如下:

Object value= getCatch(Key);
if(null=value){
	sync{
		value= getCatch(Key);
		if(null=value){
			//查询数据库,更新缓存
		}
	}
}

主从架构情况下:
先更新主数据库后删缓存
由于主从同步需要一段时间,而从数据库中的数据还是老数据,可能会把从库中的数据保存到缓存中。导致缓存和数据库不一致。
解决方案:延时双删
更新数据库的时候删一次缓存,1秒钟之后再次删除缓存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值