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

    文章

    248

    浏览量

    27642
  • 数据库
    +关注

    关注

    7

    文章

    3993

    浏览量

    67734
  • 分布式系统
    +关注

    关注

    0

    文章

    150

    浏览量

    19823

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    EtherCAT科普系列(15):EtherCAT技术在分布式测控系统领域应用

    分布式测控系统即集散控制系统,是一种以控制器和现场设备为基础,将相关工艺信号汇集到系统,并由操作
    的头像 发表于 07-08 11:17 916次阅读
    EtherCAT科普系列(15):EtherCAT技术在<b class='flag-5'>分布式</b>测控<b class='flag-5'>系统</b>领域应用

    数据库数据恢复—MongoDB数据库文件丢失的数据恢复案例

    MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库
    的头像 发表于 07-01 11:13 456次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—MongoDB<b class='flag-5'>数据库</b>文件丢失的<b class='flag-5'>数据</b>恢复案例

    MySQL数据库是什么

    MySQL数据库是一种 开源的关系型数据库管理系统(RDBMS) ,由瑞典MySQL AB公司开发,后被Oracle公司收购。它通过结构化查询语言(SQL)进行数据存储、管理和
    的头像 发表于 05-23 09:18 914次阅读

    分布式存储数据恢复—虚拟机上hbase和hive数据库数据恢复案例

    分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库分布式存储故障:
    的头像 发表于 04-17 11:05 513次阅读

    数据库数据恢复——MongoDB数据库文件拷贝后服务无法启动的数据恢复

    MongoDB数据库数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据库。 MongoDB数据库
    的头像 发表于 04-09 11:34 652次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复——MongoDB<b class='flag-5'>数据库</b>文件拷贝后服务无法启动的<b class='flag-5'>数据</b>恢复

    深入HarmonyOS NEXT开发的ArkData操作SQLite数据库

    大家好,我是 V 哥。今天给大家整理的内容是关于鸿蒙 NEXT 开发中使用 ArkData 操作 SQLite 数据库的详细介绍,从入门到精通,包含案例代码和注释,帮助小白快速入门到提升。赞后看,家财万贯。
    的头像 发表于 03-07 10:55 779次阅读

    【「鸿蒙操作系统设计原理与架构」阅读体验】02-华为鸿蒙设计理念

    了一个全局一致的访问视图,就像所有设备共享了一个巨大的文件,用户可以随时随地访问自己需要的文件 。 在实际应用分布式文件系统的高性能和低延时特性也得到了充分体现。当你在电脑上编辑
    发表于 02-23 16:16

    服务器数据恢复—linux操作系统云服务器数据恢复案例

    某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作
    的头像 发表于 02-10 18:00 617次阅读
    服务器<b class='flag-5'>数据</b>恢复—linux<b class='flag-5'>操作系统</b>云服务器<b class='flag-5'>数据</b>恢复案例

    分布式云化数据库有哪些类型

    分布式云化数据库有哪些类型?分布式云化数据库主要类型包括:关系型分布式数据库、非关系型分布式数据库
    的头像 发表于 01-15 09:43 865次阅读

    SqlServer数据恢复—SqlServer数据库数据恢复案例

    一块硬盘上存放的SqlServer数据库,windows server操作系统+NTFS文件系统。由于误操作导致分区损坏,需要恢复硬盘里的SqlServer
    的头像 发表于 01-09 11:15 752次阅读
    SqlServer<b class='flag-5'>数据</b>恢复—SqlServer<b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复案例

    基于ptp的分布式系统设计

    在现代分布式系统,精确的时间同步对于确保数据一致性、系统稳定性和性能至关重要。PTP(Precision Time Protocol)是一
    的头像 发表于 12-29 10:09 975次阅读

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据文件资产迁移

    提供了async版本供该场景使用。 当前,wantParams“sessionId”字段在迁移流程中被系统占用,建议开发者在wantParams定义其他key值存储该分布式
    发表于 12-24 10:11

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据权限与基础数据

    提供了async版本供该场景使用。 当前,wantParams“sessionId”字段在迁移流程中被系统占用,建议开发者在wantParams定义其他key值存储该分布式
    发表于 12-24 09:40

    云托管可以操作数据库吗?安全性如何

    云托管可以操作数据库。在云托管环境,开发者可以通过使用云服务提供商提供的API或SDK来连接并操作数据库。云托管提供了多种安全性措施来
    的头像 发表于 12-11 13:35 564次阅读

    数据库数据恢复—MYSQL数据库ibdata1文件损坏的数据恢复案例

    mysql数据库故障: mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复
    的头像 发表于 12-09 11:05 1049次阅读