你们引入缓存中间件,会去解决数据库缓存双写一致性的问题吗

2021-06-03 16:57:23 +08:00
 zhongpingjing
看了一篇博文了解了一些相关的内容,了解到引起不一致性的原因:
先删缓存,再更新 DB (这种策略应该没有人用?)
先更新 DB,再删缓存(这种发生不一致性的概率虽然可以忽略不计,但是是否需要去防止?)
先更新 DB,然后删除缓存失败(真的会发生删除缓存失败吗?网络原因?)
DB 主从复制的延迟造成不一致
。。。

解决这个双写一致性问题,需要双删和重试。感觉这种方式代价有点大啊。
在实际生产中,会这样去解决吗?有没有更好的办法?
4054 次点击
所在节点    Java
29 条回复
abigeater
2021-06-04 11:40:56 +08:00
@zhongpingjing 不会丢吧 边界值可以直接写回 DB 后清缓存和删写回队列 其他的都可以走这个流程 一般 DB 崩都是瞬发的请求导致的 在定时服务写回 DB 可以是频繁的不间断的所以写回 DB 队列应该不会造成堵塞(可能,目前我还没遇过堵塞至少)
lsp7572
2021-06-04 14:35:28 +08:00
@zhch602 当然是视业务场景而定,你这一句话找死还没我四个字的信息量大好吧。。起码给个例子,我也能学习。。
xuanbg
2021-06-04 15:00:44 +08:00
大多数程序员可能没有意识到的是:缓存失效的时序其实并没有辣么重要。假设先读到数据,然后数据被删除,再用这个数据创建了新的数据。在业务上有问题吗?一点问题就没有呀。例如某个客户被删除了,原先基于这个客户的数据失效了吗?并没有啊,所以你们在纠结什么呢?

所以,先删数据库再删缓存就行了。
zhch602
2021-06-04 16:07:06 +08:00
@lsp7572
@iyaozhen
因为即使用了延迟双删还是有可能不一致,最关键的是 我没听说过哪个业务敢在线上让线程 sleep 个几百毫秒甚至更多
至于资料,你们随便在 google 上搜延迟双删第一页就有文章,直接放个链接 https://www.cnblogs.com/zhouj-happy/p/12616906.html
lsp7572
2021-06-04 17:34:19 +08:00
@zhch602 你发的这文章只是提出了问题,没有解决问题。

至于你说的 sleep 这个就是业务来决定的

延时双删就是一定程度可以解决缓存一致性问题的解决方法
lsp7572
2021-06-04 17:41:07 +08:00
另外删除操作可以另起线程,这个是业务方可以考量的虽然会增加编码复杂度
zhch602
2021-06-04 22:31:55 +08:00
@lsp7572 解决方法就是没有完美的解决方法,要视业务而定,要强一致只能加锁,最终一致的话延迟双删也是下下策
JasonLaw
2021-06-10 21:16:36 +08:00
<amp-youtube data-videoid="ZAZJqEKUl3U" layout="responsive" width="480" height="270"></amp-youtube>
liian2019
2021-06-15 17:55:02 +08:00
@potatowish 这得单独整一套分布式缓存服务才行,太重了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/781166

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX