单节点情况下淘汰缓存?更新数据库??哪个先执行?

一. 更新缓存有必要吗??

解析:没必要,缓存数据都来自数据库,将缓存数据一个个更新消耗资源远比直接删除cache再读取数据库数据放到cache这一过程更大,所以直接删缓存

1.淘汰缓存

比如线程A更新变量C1,D1,去缓存找到是否有变量C1,D1,假设缓存刚好有这两个变量,则将这两个变量删除

2.先淘汰缓存,后更新数据库(保证了数据的一致性,适用于对一致性要求高的业务)

分为同步更新和异步更新两种情况
同步更新:线程A更新数据库,线程B查找缓存却未命中cache然后读取数据库并放到缓存里.当线程B把数据读取到缓存后线程A才更新好数据,因为缓存里存放的是旧的数据库里的,此时缓存和数据库数据不一致
异步更新:线程A更新数据库,线程B查找缓存却未命中cache然后读取数据库,不对缓存进行操作,线程A更新完后缓存数据和数据库数据一致.

3.异步更新会导致更新数据库后缓存里没有变量C1,D1,怎么解决??

通过订阅binlog来异步更新缓存

4.为什么同步更新会导致数据不一致

异步更新完数据库后缓存里没有变量C1,D1,假如线程C去拿变量C1时会直接访问数据库,这时拿到的是正确的值.而同步更新拿到的是缓存里的数据即更新数据库前的值,而数据库里的数据才是正确的数据,因此说同步更新会造成缓存和数据库数据不一致

5.解决同步更新数据不一致问题

,解决方案:①串行化②延时双删+设置缓存的超时时间+重试机制

二.先更新数据库,后淘汰cache(可能会有一段时间的数据不一致,但读的效率很好——保证了数据读取的效率,如果业务对一致性要求不是很高,这种方案最合适)

更新数据库期间读取到的是缓存里数据,但是数据库更新完淘汰cache后cache里的数据和数据库里的数据会一致(最终一致性)

三.先淘汰缓存,后更新数据库VS先更新数据库,后淘汰cache

先淘汰缓存,后更新数据库会导致淘汰缓存~将数据库数据C1D1复制到缓存这段期间其他线程都是直接访问数据库,因为这段期间缓存里没有变量C1,D1,多个线程访问变量C1D1会给数据库造成极大的压力

更新数据库,后淘汰cache:直到淘汰cache:更新数据库,~淘汰cache期间其他线程访问变量C1D1的值都是缓存里的旧值.因为访问C1,D1时不必直接访问数据库,因此保证了数据读取的效率

该文章引用自https://www.cnblogs.com/rjzheng/p/9302609.html?spm=a2c6h.12873639.0.0.2020fe8dbk2chI

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值