缓存一致性如何理解?

缓存的数据怎么保证跟数据库里面的数据的一致性性。
这里我想多说一句,我们说到一致性,我们经常就容易把缓存里面的一致性跟似乎里面的一致性搞混,也就是ACID里面的C、CAP里面的C。
虽然这两个都叫一致性,Consistence,但是它们的差别还是挺大的。
CAP里面的CAP就是多个赋本之间,它们逻辑上要相等。
那ACID里面的CNN是多个数据它们之间的逻辑上的一些约束关系。

二 使用方面

第一点就是不建议区缓存这种查询频率不是很高的数据。
当然很多人说我们现在有这种ARU这种算法,去保证我们缓存的都是这种热点数据。
但是很多时候在生产环境还是比较复杂了,比如说有些数据,它虽然访问的频率很低,但是它占有了空间很大。
你就算用ARU算法,你这个空间的利用率其实并不高。
第二点就是更新次数,相比由这个查询次数如果太高的话也不建议区缓存。
相当于这种缓存的命中率其实并不高,以刚缓存的精确并没有读几次,它又要去刷新。
简单来说就是频繁更新的数据,也不太建议区做缓存。

第三就是被这种数据移资性要求极高的场景,也不太建议用缓存。

三 常见问题

这对缓存数据的一致性,我们也从cryd去分析,首先是查询这个没什么好讲的。
然后就是新增,往数据库里面新增一条数据,越发现,这个时候如果有一个请求过来,它缓存里面是查不到的,就直接查数据货,这个时候是没有任何副本的。
所以说这里是不存在这种一致性问题的,然后就是删除一个数据,那这里需要分两种情况来讨论的。
第一种就是缓存里面是没有缓存这个数据的,那删除它是没有任何副本,这里没什么一致性的问题。
第二种情况就是如果删除了之后,缓存里面也有这个数据,那这里问题就会编得比较复杂了。
简单的时候其实就两种重点,先删缓存在删数据库,要么就是先删数据库再删缓存,那我们先来聊先删缓存再删数据库,这样行吗?不行。
如果你先删缓存,那这个时候一个读请求过来,没查到缓存,直接去查数据库老的数据,把它再删到缓存里面去,那最重要的结果就是缓存里面有数据,数据库里面没有数据。
这个两边肯定是不意思的。那先删数据库再去删缓存,那这个有问题吗?其实也是有问题的,假设有两个线程,T线程它先读到老数据,还没有塞到缓存里面,那这个时候第二线程来删数据库再去删交缓存。
那这个时候第二再把老数据塞在这个缓存里面,那最重要的结果也是数据库里面没有数据,缓存里面有一个老数据。
所以这里出现了这种并法,也是没办法去控制这种时序的,所以这就是一个概率性问题。

如果中间存在这种机器的卡盾或者网络的这种抖动,这种情况是不可空的,然后我们再来聊一下更新数据。
那这里其实也很容易想到,要么先更新缓存,再更新数据库,要么先更新数据库再更新缓存。
那这里也完全存在一种情况,就是第二线程它更新了老的数据,然后还没有更新缓存的时候,它可能机器机崩啦,又线程它更新的数据,然后又更新了这个缓存。
那这个时候第二线程它又去把这个老数据给更新了缓存里面去,那最后导致了结果也是缓存跟数据库里面的数据它是不一致的。
所以这两个更新,不管你的顺序是怎么样了,都会存的这种不一致的可能性。
我这里还是想再强调一下,这是一个并发问题,是一个概率性问题,所以说它最大的挑战跟难点也是在这里。

然后我们再聊一下,为什么现在主流的策略都是先更新数据库再去删出缓存。
我们还是拿两个线程,就第二线程如果更新的数据库,这个时候如果机器机谁啦。
那第二个线程也更新的数据库,第一个线程就算卡顿了一下,第二个线程先去把缓存给删掉,那第一个线程再去把缓存给删掉,
它们这两次删出缓存达到的效果其实是一样的,都是导致缓存的失效然后去查数据库最新的数据塞了缓存里面。
但是这个方案就完美了吗,当然不是。
比如说这个时候缓存里面没有数据,提到线程读了一个老数据,这个时候机器卡顿了一下还没有塞到缓存里面,
那这个时候线程把这个数据给编形了,然后去删出了一项缓存,那这个时候又醒过来了,把老的数据塞到缓存里面去。
那是不是造成了两面的数据又是不一致的?
这也是为什么网上会流行一些所谓的延时双删的解决方案。
而且这里只分析了单节点的这种缓存跟数据库的一致性。
如果这里是缓存在应用节点的本地类传,并且是其群部署了。
那这里还设计到多节点的这个缓存刷新问题。
所以这种缓存一致性的问题是非常复杂的。
而且这里我还要补充两点,我们上面讨论这种缓大部分都是最终一致的。
比如说我们先去更新数据库,再去更新缓存,那这个更新的过程当中两别的数据就是不一致的。
所以我之前面试的时候也问过后显的,如果说要保证多个部分之间的强一致是你怎么去保证。
这个解决方案其实也简单出报,就是加锁。
但是缓存它就是为了提升性能,你加锁的话这个肯定对性能是有影响的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值