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

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

3天内不再提示

缓存与数据库出现不一致的情况如何解决

电子工程师 来源:网络整理 作者:工程师飞燕 2018-07-15 10:24 次阅读

一、数据库主从不一致

先回顾下,无缓存时,数据库主从不一致问题。

缓存与数据库出现不一致的情况如何解决

如上图,发生的场景是,写后立刻读:

主库一个写请求(主从没同步完成)

从库接着一个读请求,读到了旧数据

最后,主从同步完成

导致的结果是:主动同步完成之前,会读取到旧数据。

可以看到,主从不一致的影响时间很短,在主从同步完成后,就会读到新数据。

二、缓存与数据库不一致

再看,引入缓存后,缓存和数据库不一致问题。

如上图,发生的场景也是,写后立刻读:

(1+2)先一个写请求,淘汰缓存,写数据库

(3+4+5)接着立刻一个读请求,读缓存,cache miss,读从库,写缓存放入数据,以便后续的读能够cache hit(主从同步没有完成,缓存中放入了旧数据)

(6)最后,主从同步完成

导致的结果是:旧数据放入缓存,即使主从同步完成,后续仍然会从缓存一直读取到旧数据。

可以看到,加入缓存后,导致的不一致影响时间会很长,并且最终也不会达到一致。

三、问题分析

可以看到,这里提到的缓存与数据库数据不一致,根本上是由数据库主从不一致引起的。当主库上发生写操作之后,从库binlog同步的时间间隔内,读请求,可能导致有旧数据入缓存。

假如主从不一致没法彻底解决,引入缓存之后,binlog同步时间间隔内,也无法避免读旧数据。

但是,有没有办法做到,即使引入缓存,不一致不会比“不引入缓存”更糟呢?这是更为实际的优化目标。

思路转化为:在从库同步完成之后,如果有旧数据入缓存,应该及时把这个旧数据淘汰掉。

四、不一致优化

如上图所述,在并发读写导致缓存中读入了脏数据之后:

(6)主从同步

(7)通过工具订阅从库的binlog,这里能够最准确的知道,从库数据同步完成的时间

画外音:本图画的订阅工具是DTS,可以是cannal,也可以自己订阅和分析binlog

(8)从库执行完写操作,向缓存再次发起删除,淘汰这段时间内可能写入缓存的旧数据

如此这般,至少能够保证,引入缓存之后,主从不一致,不会比没有引入缓存更坏。

画外音:即使引入缓存,也只有一个很小的时间间隔,可能读到旧数据。

五、结尾

问:如何完全避免,主从同步时间差,数据的一致性?

答:详见《数据库主从不一致,怎么解?》。

问:该方案,只能优化,并发读写情况下,缓存与数据库一致性问题。如果,缓存与数据库两次操作,原子性被破坏(例如:修改数据库成功,淘汰缓存失败,导致的数据不一致),如何优化数据的一致性呢?

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

    关注

    1

    文章

    220

    浏览量

    26436
  • 数据库
    +关注

    关注

    7

    文章

    3584

    浏览量

    63346
收藏 人收藏

    评论

    相关推荐

    何解数据库缓存一致

    缓存一致性 每次逢年过节的时候抢票非常艰难,放票的时候那么多人同时去抢票,如果所有人查询、购票等都去访问数据库,那数据库的压力得有多大,这时候很多都会引入
    的头像 发表于 09-25 15:25 651次阅读
    如<b class='flag-5'>何解</b>决<b class='flag-5'>数据库</b>与<b class='flag-5'>缓存</b><b class='flag-5'>一致</b>性

    传递表格中数据不一致的问题

    我将些随机变量传递到表格中具体如下:为啥呢流量1显示控件与表格中数据不一致都是流量1的数据要领先表格中数据比如 按下按钮 流量1
    发表于 09-26 16:07

    labview写入excel,打开excel会出现格式与扩展名不一致..

    rt,调用“编程→文件I/O→写入电子表格文件”函数将数据写入exel文档,也成功得到数据,但是每次在电脑上打开保存的excel文档时总是会提示:文件格式与文件扩展名不一致,如图,并且有时保存
    发表于 04-01 10:38

    不一致IP设置

    有没有人使用cRIO之后,遇到过这个问题?我使用Ni MAX连接的时候,系统状态直是:不一致IP设置请教大家,这个问题该怎么处理?
    发表于 06-25 08:49

    pads logic 管脚不一致问题

    之前直是好的,今天在画原理图时,出现了管脚不一致问题,看图片只有在接地时才会出现问题,接电源是ok的,有没有谁遇到过这个问题?怎么解决
    发表于 07-20 14:28

    STM32串口使用DMA方式进行接收,打印的数据和发送的数据不一致

    我STM32串口为不占cpu资源使用DMA方式进行接收,设定接收缓冲区,在while(1)中查询已接收到的数据并进行处理,可是使用串口调试工具发送数据到板子,板子再将数据通过窗口打印处理,打印的
    发表于 03-07 06:52

    Redis缓存和MySQL数据不一致原因和解决方案

    高并发架构系列:Redis缓存和MySQL数据一致性方案详解
    发表于 03-27 15:55

    串口通信收到的数据和程序发的数据不一致

    串口助手能收到数据 但是和程序发的数据不一致板子没有电平转换芯片 用的转TTL串口线具体看下图片请各位大神赐教 感谢感谢
    发表于 10-16 22:32

    为什么Mcspi往Flash写数据时,前1024Byte个数据读写不一致

    我使用EVM5517开发板,调试通了Mcspi口后,开始改程序,将个文件写进flash,但是前1024Byte个数据写的和读的数据不一致,后面的
    发表于 10-23 10:18

    MAX直显示IP不一致怎么解决

    请问各位大神,这种IP地址不一致何解决?我已经按照MAX上面显示的IP地址修改了,还是出现IP地址不一致情况
    发表于 09-04 09:55

    labview和agilent4294数据不一致问题

    我利用GPIB,让labview程序和agilent4294建立通信后。进行了单次采集,并在程序中加入读取4294数据作图部分。但是发现labview界面的作图结果与4294显示屏上的结果不一致。存在个类似于读取的时间延迟问题
    发表于 09-11 15:23

    何解决STM32发送的数据与串口助手上面显示数据不一致的问题?

    何解决STM32发送的数据与串口助手上面显示数据不一致的问题?
    发表于 12-09 06:59

    怎样去解决zigbee数据发送周期和设定的周期不一致的问题呢

    为什么zigbee数据发送周期和设定的周期会不一致呢?是什么原因呢?怎样去解决?
    发表于 02-24 07:14

    AD9910初始相位不一致

    调试AD9910的DRG模式的时候,目前能出线性调频信号,但是会出现相位不一致,初始相位直在跳,因为DRG模式可以选择频率、相位、幅度三个中个进行控制,我目前是控制的频率,请问怎么
    发表于 10-24 15:49

    分布式大数据不一致性检测

    关系数据库中可能存在数据不一致性现象,关系数据库数据质量的一个主要问题是存在违反函数依赖情况,为
    发表于 01-12 16:29 0次下载