0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分布式系统中先操作数据库还是先操作缓存

数据分析与开发 来源:捡田螺的小男孩 作者:捡田螺的小男孩 2021-09-30 14:46 次阅读

前言

在分布式系统中,缓存和数据库同时存在时,如果有写操作,先操作数据库还是先操作缓存呢?本文将分5种方案展开阐述对比,谢谢阅读~github地址,衷心感谢每一颗star

❝https://github.com/whx123/JavaHome❞

缓存维护方案一

如果是一读(线程B)一写(线程A)操作,「先操作缓存,再操作数据库」。流程图如下所示:

1.线程A发起一个写操作,第一步del cache

2.线程A第二步写入新数据到DB

3.线程B发起一个读操作,cache miss缓存失效了。

4.线程B从DB获取最新数据

5.线程B执行set cache,把从DB读到的数据,更新到缓存。

「这样看,没啥问题」。

1.线程A发起一个写操作,第一步del cache

2.此时线程B发起一个读操作,cache miss

3.线程B继续读DB,读出来一个老数据

4.然后老数据设置入cache

5.线程A写入DB最新的数据

OK,酱紫,就有问题了吧,老数据入到缓存了,「每次读都是老数据啦,缓存与数据与数据库数据不一致了」。

缓存维护方案二

上个方案是一读一写,如果是双写操作,「先操作缓存,在操作数据库」,会怎么样呢?

1.线程A发起一个写操作,第一步set cache

2.线程A第二步写入新数据到DB

3.线程B发起一个写操作,set cache

4.线程B第二步写入新数据到DB

「这样看,也没啥问题。」

1.线程A发起一个写操作,第一步set cache

2.线程B发起一个写操作,第一步set cache

3.线程B写入数据库到DB

4.线程A写入数据库到DB

执行完后,缓存保存的是B操作后的数据,数据库是A操作后的数据,「缓存和数据库数据不一致了」。

缓存维护方案三

一写(线程A)一读(线程B)操作,「先操作数据库,再操作缓存」。

1.线程A发起一个写操作,第一步write DB

2.线程A第二步del cache

3.线程B发起一个读操作,cache miss

4.线程B从DB获取最新数据

5.线程B同时set cache

有些朋友可能认为,在第2步删除缓存之前,线程B读过来呢?这时候,读到的是缓存老数据,这个可以认为是正常业务逻辑呀,下次再读取就是正确数据了。这种方案「没有明显的并发问题」,但是呢,「步骤二删除缓存失败」,还是个问题。不过概率比较小,「优于方案一和方案二」,平时工作中也是使用方案三。综上对比,我们一般采用方案三,但是有没有完美全解决方案三的弊端的方法呢?

缓存维护方案四

这个是方案三的改进方案,都是先操作数据库再操作缓存

通过数据库的「binlog」来「异步淘汰key」,以mysql为例 可以「使用阿里的canal将binlog日志采集发送到MQ队列」里面,然后「通过ACK机制 确认处理」这条更新消息,删除缓存,保证数据缓存一致性。但是呢还有个问题,「如果是主从数据库呢」?

缓存维护方案五

主从DB问题:因为主从DB同步存在延时时间。如果删除缓存之后,数据同步到备库之前已经有请求过来时,「会从备库中读到脏数据」,如何解决呢?

缓存维护总结

综上所述,在分布式系统中,缓存和数据库同时存在时,如果有写操作的时候,「先操作数据库,再操作缓存」。如下:

1.读取缓存中是否有相关数据

2.如果缓存中有相关数据value,则返回

3.如果缓存中没有相关数据,则从数据库读取相关数据放入缓存中key-》value,再返回

4.如果有更新写数据,则先操作数据库,再操作缓存

5.为了保证第四步更新缓存成功,使用binlog异步通知操作

6.如果是主从数据库,binglog取自于从库

7.如果是一主多从,每个从库都要采集binlog,然后消费端收到最后一台binlog数据才删除缓存

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 缓存
    +关注

    关注

    1

    文章

    220

    浏览量

    26436
  • 数据库
    +关注

    关注

    7

    文章

    3584

    浏览量

    63346
  • 分布式系统
    +关注

    关注

    0

    文章

    139

    浏览量

    19096

原文标题:并发环境下,先操作数据库还是先操作缓存?

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙HarmonyOS开发实例:【分布式关系型数据库

    使用[@ohos.data.relationalStore]接口和[@ohos.distributedDeviceManager] 接口展示了在eTS中分布式关系型数据库的使用,在增、删、改、查的基本操作外,还包括
    的头像 发表于 04-11 09:52 162次阅读
    鸿蒙HarmonyOS开发实例:【<b class='flag-5'>分布式</b>关系型<b class='flag-5'>数据库</b>】

    通过Modbus读写数据库数据

    本文是将数据库数据转为Modbus服务端/从站,实现数据库内的数据也可以走Modbus协议通过网口或串口读写的案例,下图是通过智能网关的参数软件(在附件
    发表于 03-14 13:44

    SQL核心知识点总结

    SQL:Structure Query Language。(结构化查询语言),通过sql操作数据库(操作数据库,操作表,操作数据)
    的头像 发表于 12-13 10:28 423次阅读
    SQL核心知识点总结

    鸿蒙原生应用开发——分布式数据对象

    ;change\", globalThis.changeCallback) 当同一组网内分布式数据对象发生改变时,同一组网的所有分布式数据
    发表于 12-08 10:01

    分布式系统硬件资源池原理和接入实践

    和音频驱动信息,存入分布式数据库。如果 AB 两个设备建立了可信关系并且通过软总线组网上线成功,分布式数据库会在 AB 两个设备之间自动同步各自的本地外设数据信息,这样,设备 A 分布式
    发表于 12-06 10:02

    HarmonyOS分布式文件系统开发指导

    监听、通过软总线建立链路,并根据分布式的设备安全等级执行不同的数据流转策略。 ● hmdfs:实现在内核的网络文件系统,包括缓存管理、文件访问、元
    发表于 11-14 17:14

    鸿蒙操作系统的前世今生

    上层接口和分布式能力的统一。 借助以上优势, 鸿蒙操作系统可实现不同终端设备之间的极速连接、硬件互助和资源共享,为不同的群体带来升级体验: 对消费者而言, 鸿蒙操作系统能够将生活场景
    发表于 10-08 19:55

    OpenHarmony 分布式硬件关键技术

    OpenHarmony技术峰会——生态与互联分论坛 ​ 正 文 内 容 OpenHarmony是一款面向未来万物互联场景的操作系统,其设计采用了分布式架构。那么OpenHarmony相比于传统操作系统
    发表于 08-24 17:25

    **分布式数据库|数据库数据类型**

    分布式数据库是一种存储在不同物理位置的数据库。与单个数据库系统的并行系统不同,分布式数据库系统由不共享物理组件的松耦合站组成。
    的头像 发表于 07-17 13:33 354次阅读

    西门子博途:扫描操作数的信号下降沿

    使用“扫描操作数的信号下降沿”指令,可以确定所指定操作数)的信号状态是否从“1”变为“0”。
    的头像 发表于 07-17 10:51 1865次阅读
    西门子博途:扫描<b class='flag-5'>操作数</b>的信号下降沿

    #分布式数据

    分布式数据
    未来加油dz
    发布于 :2023年07月03日 22:58:32

    Greenplum数据库权限控制(2)#分布式数据

    分布式数据
    未来加油dz
    发布于 :2023年07月03日 22:46:50

    Greenplum数据库权限控制(1)#分布式数据

    分布式数据
    未来加油dz
    发布于 :2023年07月03日 22:46:25

    扫描操作数的信号上升沿

    使用“扫描操作数的信号上升沿”指令,可以确定所指定操作数)的信号状态是否从“0”变为“1”。
    的头像 发表于 06-27 09:39 1679次阅读
    扫描<b class='flag-5'>操作数</b>的信号上升沿

    基于89C51单片机的2按键加减操作数码管显示源代码

    基于89C51单片机的2按键加减操作数码管显示源程序
    发表于 05-12 16:51 1次下载