• 缓存和DB一致性


    读操作,一般是先查询缓存,查询不到再查询数据库,最后回写进缓存。
    写操作,究竟是先删除(更新)缓存,再更新数据库,还是先更新数据库,再删除(更新)缓存呢?

    1、给缓存设置过期时间
    适用于对数据一致性要求较低或者写请求很少的业务
    
    当读请求没有命中缓存时,就从数据库中读,之后回写到缓存里,同时设置一个过期时间。
    写请求直接更改数据库,不用操作缓存。
    
    
    2、先更新数据库,再更新缓存
    如果利用到缓存,那么肯定是读多写少的场景
    缺点:
    写多读少时,频繁更新缓存会降低性能
    并发情况下可能存在将脏数据写回缓存的风险
    
    为什么会有脏读:
    首先线程1更新数据库,还没来得及更新缓存,线程2更新数据,在更新缓存成功,然后线程1在更新缓存,结果就变成了数
    据库和缓存的数据不一致。
    
    3、先更新缓存,再更新数据库
    和方案2类似,也会存在相同的问题。
    
    缺点:
    比如线程1更新缓存,还没来得及更行数据库,线程2更新缓存在更新数据库,最后线程1更新数据库,这个时候数据和缓存不一致。
    
    
    4:先更新数据库,再删除缓存
    既然方案2与方案3都是更新缓存,这里不妨直接删除缓存呢?
    
    缺点:
    这种也有一个问题就是:当线程1准备更新数据库,线程1还没来得及执行,线程2过来读,还没写入缓存,然后线程1更
    新数据,并且删除缓存,线程2在写入缓存就造成了数据不一致。
    
    5、先删除缓存,再更新数据库
    缺点:线程1删除缓存,线程2过来读,还没写入缓存,结果线程1更新了数据库,线程2在写入缓存,这个时候,缓存和数据
    库的数据也不一致。
    
    
    方案6:延时双删
    更新请求:先删除缓存,在更新数据库,在删除缓存。
    
    缺点:
    存在第二次删除失败的情况
    
    
    方案7:消息队列
    先更新数据库,接着将删除缓存的消息投递到mq中。自身拿到消息后,尝试进行删除缓存。如果失败,则不断进行重试。
    
    缺点:
    引入了消息队列,系统的复杂性提升,可用性降低。
    也会带来各种各样的问题,例如消息丢失、乱序与重复消费等。乱序与重复消费的问题,在删除缓存的场景下,不会造
    成任何问题。
    
    
    方案8    消息队列+订阅binlog
    复杂度提升了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    缓存和DB一致性-canal,其实这个也是基于Binlog+Mq的方式跳转

  • 相关阅读:
    谈谈VPN是什么、类型、使用场景、工作原理
    NIO和BIO
    计网第五章(运输层)(六)(TCP可靠传输的实现)
    MySQL库的操作
    `算法题解` `AcWing` 4508. 移动的点
    供应链管理的基本方法
    Excel中插入加乘混合公式
    低代码招投标应用:全程不见面,一次都不跑,快速优化招投标流程
    Ubuntu 24.04 LTS 安装 touchegg 开启触控板多指手势
    第6周学习:Vision Transformer & Swin Transformer
  • 原文地址:https://blog.csdn.net/weixin_37862824/article/details/134441977