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

    浏览量

    27844
  • 数据库
    +关注

    关注

    7

    文章

    4092

    浏览量

    68676
  • 分布式系统
    +关注

    关注

    0

    文章

    157

    浏览量

    19943

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【米尔TI AM62L开发板试用】+数据库操作及功能测试

    )启用SQLite3 启用SQLite3的操作如图1所示,随后即可使用数据库指令进行操作。 图1 启用SQLite3 (2)创建数据库 创建数据库
    发表于 05-11 11:31

    AI Ceph 分布式存储教程资料大模型学习资料2026

    的实战应用,优化数据加载路径是提升训练效率的关键技术手段。科技视角下的解决方案,引入了多级缓存与智能预取机制。 针对训练数据集中频繁访问的热点数据
    发表于 05-01 17:35

    京东缓存中间件架构与缓存内核优化

    一、京东缓存中间件架构 1、背景 在当今高并发、分布式系统架构缓存已成为提升应用性能、降低数据库
    的头像 发表于 04-03 16:18 1905次阅读
    京东<b class='flag-5'>缓存</b>中间件架构与<b class='flag-5'>缓存</b>内核优化

    MySQL数据库慢查询分析与优化实战

    在讨论MySQL慢查询之前,需要明确一个关键前提:什么是慢查询? 不同业务场景下,慢查询的定义差异巨大。一个数据报表后台的SQL执行30秒可能属于正常范围,但一个订单创建的数据库操作
    的头像 发表于 04-02 09:38 292次阅读

    2022全新版!Java分布式架构设计与开发实战(完结)

    2022全新版!Java分布式架构设计与开发实战(完结) 分库分表实战:Java海量数据存储架构设计 在现代互联网应用,随着业务规模的指数级增长,数据库性能瓶颈已成为制约
    发表于 03-30 15:20

    TiDB分布式数据库运维实践

    TiDB 是 PingCAP 开发的开源分布式关系型数据库,兼容 MySQL 5.7 协议,底层存储基于 TiKV(分布式 KV 存储)和 RocksDB。它解决的核心问题是:当单机 MySQL 无法承载
    的头像 发表于 03-04 15:44 398次阅读

    分布式数据恢复—Ceph+TiDB数据恢复报告

    无法正常访问。目标需要恢复的RBD卷存储了一台虚拟机的完整磁盘镜像,该虚拟机内部运行TiDB分布式数据库系统,包含重要的业务数据
    的头像 发表于 02-03 17:22 317次阅读
    <b class='flag-5'>分布式</b><b class='flag-5'>数据</b>恢复—Ceph+TiDB<b class='flag-5'>数据</b>恢复报告

    蜂鸟自定义指令软件讲解和内联汇编(一)

    具体使用的寄存器索引(譬如到底是 x1 还是 x2 等),编译器会根据引号中指定的操作数约束,按照编译优化的原则来分配合理的寄存器索引号。程序员仅需要关心操作数和变量的映射,无须关心操作数
    发表于 10-24 10:51

    【节能学院】Acrel-1000DP分布式光伏监控系统在奉贤平高食品 4.4MW 分布式光伏应用

    摘要:在“双碳”和新型电力系统建设背景下,分布式光伏接入比例不断提高,对配电网电压、调度运行及调峰等环节造成强烈冲击。本文设计包含平台层、设备层二层架构体系的分布式光伏管控平台,以及小容量工商业
    的头像 发表于 08-23 08:04 3751次阅读
    【节能学院】Acrel-1000DP<b class='flag-5'>分布式</b>光伏监控<b class='flag-5'>系统</b>在奉贤平高食品 4.4MW <b class='flag-5'>分布式</b>光伏<b class='flag-5'>中</b>应用

    分布式光伏发电监测系统技术方案

    分布式光伏发电监测系统技术方案 柏峰【BF-GFQX】一、系统目标 :分布式光伏发电监测系统旨在通过智能化的监测手段,实现对
    的头像 发表于 08-22 10:51 3591次阅读
    <b class='flag-5'>分布式</b>光伏发电监测<b class='flag-5'>系统</b>技术方案

    Redis缓存的经典问题和解决方案

    用户疯狂查询数据库不存在的数据,每次查询都绕过缓存直接打到数据库,导致数据库压力骤增。
    的头像 发表于 08-20 16:24 958次阅读

    一键部署无损网络:EasyRoCE助力分布式存储效能革命

    分布式存储的性能瓶颈往往在于网络。如何构建一个高带宽、超低时延、零丢包的无损网络,是释放分布式存储全部潜力、赋能企业关键业务(如实时数据库、AI训练、高性能计算)的关键挑战。
    的头像 发表于 08-04 11:34 1917次阅读
    一键部署无损网络:EasyRoCE助力<b class='flag-5'>分布式</b>存储效能革命

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

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

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

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

    SQLSERVER数据库是什么

    支持在Linux和容器化环境运行。 核心特点 关系型数据库 基于SQL(结构化查询语言)进行数据操作,支持表、行、列等结构化存储。 提供ACID(原子性、一致性、隔离性、持久性)事务
    的头像 发表于 05-26 09:19 1366次阅读