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

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

3天内不再提示

分布式系统中的数据库和缓存操作顺序

汽车玩家 来源:简书 作者:Java微服务 2020-05-03 14:36 次阅读

前言

在分布式系统中,缓存和数据库同时存在时,如果有写操作的时候,先操作数据库还是先操作缓存呢?先思考一下,可能会存在哪些问题,再往下看。下面我分几种方案阐述。

缓存维护方案一

假设有一写(线程A)一读(线程B)操作,先操作缓存,在操作数据库。,如下流程图所示:

分布式系统中的数据库和缓存操作顺序

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

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

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

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

5)请求B同时set cache

这样看,没啥问题。我们再看第二个流程图,如下:

分布式系统中的数据库和缓存操作顺序

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

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

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

4)然后老数据入cache

5)线程A写入了最新的数据

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

缓存维护方案二

双写操作,先操作缓存,在操作数据库。

分布式系统中的数据库和缓存操作顺序

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

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

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

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

这样看,也没啥问题。,但是有时候可能事与愿违,我们再看第二个流程图,如下:

分布式系统中的数据库和缓存操作顺序

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

2)线程B发起一个写操作,第一步setcache

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

这种方案没有明显的并发问题,但是有可能步骤二删除缓存失败,虽然概率比较小,优于方案一和方案二,平时工作中也是使用方案三。

综上对比,我们一般采用方案三,但是有没有完美全解决方案三的弊端的方法呢?

缓存维护方案四

这个是方案三的改进方案,都是先操作数据库再操作缓存,我们来看一下流程图:

分布式系统中的数据库和缓存操作顺序

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

但是呢还有个问题,如果是主从数据库呢?

缓存维护方案五

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

分布式系统中的数据库和缓存操作顺序

缓存维护总结

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

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

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

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

(4)如果有更新数据,则先更新数据,再删除缓存

(5)为了保证第四步删除缓存成功,使用binlog异步删除

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

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

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

    关注

    7

    文章

    3794

    浏览量

    64362
  • 分布式系统
    +关注

    关注

    0

    文章

    146

    浏览量

    19219
收藏 人收藏

    评论

    相关推荐

    PingCAP推出TiDB开源分布式数据库

    的性能表现。我们将继续坚持开源的创新理念,将TiDB打造成一个领先的数据库产品。” 部署新一代分布式数据库已经成为用户释放数据价值、推动数字化转型的重要方式,但随着数据的快速增长以及上
    的头像 发表于 11-24 11:26 389次阅读
    PingCAP推出TiDB开源<b class='flag-5'>分布式数据库</b>

    一文讲清什么是分布式云化数据库

    分布式云化数据库是一种先进的数据管理系统,它将传统的数据库技术与分布式计算、云计算和大
    的头像 发表于 10-14 10:06 218次阅读

    分布式云化数据库的优缺点分析

    分布式云化数据库的优点主要体现在高可用性和容错性、可扩展性、体系结构、数据一致性、成本、升级迭代等方面。同时也存在一些缺点,如通信开销较大、数据的存取结构复杂、
    的头像 发表于 09-14 09:42 256次阅读

    软件系统数据库的分库分表设计

    分布式集群,实现分库分表功能,解决数据库中海量数据存储和查询性能的问题。MyCat 还是一个数据库的集群中间件,主要实现 RDBMS 数据库
    的头像 发表于 08-22 11:39 315次阅读
    软件<b class='flag-5'>系统</b><b class='flag-5'>数据库</b>的分库分表设计

    基于分布式存储WDS的金融信创云承载数据库类关键应用

    基于分布式存储WDS的金融信创云承载数据库类关键应用
    的头像 发表于 08-16 09:42 269次阅读
    基于<b class='flag-5'>分布式</b>存储WDS的金融信创云承载<b class='flag-5'>数据库</b>类关键应用

    基于Openharmony轻量级操作系统分布式数据管理开发案例

    实验内容本例程演示如何在小凌派-RK2206开发板上使用OpenHarmony轻量级操作系统进行KvStore(即分布式数据管理)数据读写。例程:(1)创建两个线程,一个负责写入KvS
    的头像 发表于 08-07 08:23 954次阅读
    基于Openharmony轻量级<b class='flag-5'>操作系统</b>的<b class='flag-5'>分布式</b><b class='flag-5'>数据</b>管理开发案例

    Memcached介绍和详解

    ,Memcached可以显著减轻后端数据库和Web服务器的负载。 Memcached作为一个高性能的内存缓存系统,通过缓存经常访问的数据来提
    发表于 07-17 15:58

    探讨篇(四):分布式数据访问解决方案

    背景 如果数据在同一个服务的同一个数据库,通过SQL即可查询相对比较简单,但当数据分布到不同服务不同的数据库
    的头像 发表于 07-12 15:19 339次阅读
    探讨篇(四):<b class='flag-5'>分布式</b><b class='flag-5'>数据</b>访问解决方案

    鸿蒙开发接口数据管理:【@ohos.data.distributedData (分布式数据管理)】

    分布式数据管理为应用程序提供不同设备间数据库分布式协同能力。通过调用分布式数据各个接口,应用程
    的头像 发表于 06-07 09:30 966次阅读
    鸿蒙开发接口<b class='flag-5'>数据</b>管理:【@ohos.data.distributedData (<b class='flag-5'>分布式</b><b class='flag-5'>数据</b>管理)】

    HarmonyOS开发实例:【分布式手写板】

    使用设备管理及分布式键值数据库能力,实现多设备之间手写板应用拉起及同步书写内容的功能。
    的头像 发表于 04-17 21:45 486次阅读
    HarmonyOS开发实例:【<b class='flag-5'>分布式</b>手写板】

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

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

    通过Modbus读写数据库数据

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

    什么是分布式架构?

    1.独立性:分布式架构的各个节点是独立运行的,它们没有依赖关系,可以单独进行升级、维护和扩展。 2.通信性:分布式架构的各个节点通过网络连接进行通信和协作,以实现
    的头像 发表于 01-12 15:04 1229次阅读
    什么是<b class='flag-5'>分布式</b>架构?

    分布式IO工业自动化数据采集与分析的核心

    代替人工操纵机器和机器体系进行加工生产的趋势,分布式I/O可以与各种传感器、执行器和控制系统相连接,实现生产线的自动化控制。通过实时采集和传输数据分布式I/O能够精确控制生产过程
    发表于 12-28 14:47

    分布式锁的三种实现方式

    ,下面将分别介绍三种常见的实现方式。 一、基于数据库实现的分布式锁 在分布式系统数据库是最常
    的头像 发表于 12-28 10:01 895次阅读