关于缓存双写强一致性解决方案

关于缓存双写强一致性解决方案

条件:在微服务中

  1. 一般操作都是先清除缓存,再更新数据库,但会发生,刚清除缓存,再一次发生读取操作,结果缓存又是更新之前的操作,当然清除缓存的操作可以进行两次,一次更新数据库之前,一次更新数据库之后,但这样仍然会产生一些脏数据

  2. 若在单体服务中,我可以使用jdk自带的阻塞队列,在有更新操作来的时候,将后续读的操作阻塞,可实现缓存双写数据强一致性

  3. 如果使用mq,如何让其性更高(如何像2中一样,更新操作阻塞后续操作,或者有更好的方式)

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
7七月 2019-12-20 06:17:22

一般操作都是先清除缓存,再更新数据库,但会发生,刚清除缓存,再一次发生读取操作,结果缓存又是更新之前的操作。

这一段没看太明白。具体什么意思。清除了缓存,再一次发生读取?

  • 提问者 qq_龙行天下_0 #1
    在并发比较高的时候,你刚删掉缓存,还没修改掉数据库的时候,又一个读请求过来,实际上缓存的就是个脏数据;我突然想到一个比较好的实现方式,使用全局锁,只有当前操作为更新时,锁生效,否则锁不生效,不知七月老师实际应用中遇到此问题如何解决?
    2019-12-21 10:26:33
  • 7七月 回复 提问者 qq_龙行天下_0 #2
    其实你这个问题是数据一致性的问题。。。mysql里用事务解决,但你涉及redis和mysql就很难做到一致性。全局锁是一个解决方案 ,但我觉得可能你需要的是让程序本身就是异步的。全局锁你确定高并发的时候能行?这个问题不好解决,需要根据具体业务分析了。 推荐看下这个文章: https://www.jianshu.com/p/36cbe3c3cf83
    2019-12-25 00:09:39
7七月 2019-12-19 18:41:10

这里我建议是这样的:

需要做这样操作的数据,再加一个标志位,把读和写的分开。如果要做 判定操作应该是去读写的那个,考虑下这个方案。

  • 提问者 qq_龙行天下_0 #1
    1.老师说的标志位分开读写,指用标记过来的url是更新,还是读,区分完了,使用自定义队列遇更新阻塞,还是mq ,单例这样,徽服务中多实例怎办
    2019-12-19 18:55:50
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师