缓存与数据库的双写划一性题目

打印 上一主题 下一主题

主题 1991|帖子 1991|积分 5973

什么是双写划一性?

双写划一指我们去更新数据库的数据之后,也要去更新缓存,使数据库与缓存的数据是划一的。
强划一性:不答应出现数据库和缓存差别等的情况,任何时间缓存和数据库的数据都要划一,强划一性通常须要付出很大的性能代价。
弱划一性:答应短时间内数据库与缓存的数据差别等,但是会通过一些方法使数据库和缓存终极是划一的,也就是终极划一性。
现在有数据须要更新,我们是先操作数据库还是先操作缓存呢?是删除缓存还是更新缓存呢?
删除缓存还是更新缓存?

答案是删除缓存。为什么?由于如果是更新缓存,更新了之后没有哀求来查询,之后又须要更新数据,那么这次更新缓存的操作就是无效的操作,由于没有哀求来查询缓存就被更新了。而删除缓存的话,只须要在有哀求来查询数据库的时候去重构一下缓存就行了。
先操作数据库还是先操作缓存?

我们先来看看先删除缓存,再更新数据库会出现的题目:

线程1去删除缓存并更新数据库,更新数据库还未完成这期间,线程2来查询缓存未命中,于是去查询数据库的旧数据,并且把旧数据写入了缓存,末了线程1去更新了数据库,这样就导致了数据库和缓存数据的差别等。
再来看看先更新数据库,再删除缓存会出现的题目:

首先线程1来查询缓存未命中,大概是缓存逾期了,然后去查询数据库并写入缓存,在还未写入缓存的这期间,线程2来更新数据库并删除缓存了,之后线程1把旧数据写入缓存成功,造成双写差别等。
固然无论是先操作缓存还是先操作数据库都有大概会造成双写差别等,但是它们出现双写差别等的概率是差别的。
先删缓存再更新数据库出现题目的情况,是在删除缓存和更新数据库之间有其他的线程来查询缓存,是在写缓存和写数据库之前插入了查询缓存和数据库的操作,我们知道写操作一样寻常是要比查询操作要慢的,所以是有概率出现这种情况的。
而先更新数据库再删缓存,首先要满足缓存失效,其次是要在查询数据库和写缓存之间插入更新数据库以及写缓存的操作,这种情况发生的概率明显就更低了。
无论是先操作数据库还是先操作缓存都有双写差别等的情况,那么我们如何保证它们的划一性?
保证强划一性:利用分布式锁

利用分布式锁,每次只答应一个线程去读大概写,那么这样就可以保证缓存和数据库的强划一性,但是这么性能太低。可以利用分布式读写锁优化,让读写互斥,读操作之间不互斥。
保证终极划一性

方案1:耽误双删 (缓存双删)
先删除缓存,再更新数据库,耽误一段时间后,又去删除缓存,这样可以将旧缓存删掉,保证最钟划一性。这里为了保证末了删缓存操作成功,可以删除失败后重试,参加最大重试次数。
这种方案可以保证终极划一性,但是耽误的时间不好控制,耽误是为了让主库的数据完全同步到从库,如果耽误时间过短,还未同步完成就删除缓存,那么还是会造成差别等的情况。
方案2:监听binlog日记
mysql的写操作都会记录到binlog日记中,可以利用canal中央件去听binlog日记,canal会伪装成mysql的一个从节点,去获取binlog日记中的信息,拿到了这些信息之后,可以通过MQ异步的去更新缓存大概删除缓存。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表