美文网首页
35. 经典问题——先更新数据库,还是先更新缓存

35. 经典问题——先更新数据库,还是先更新缓存

作者: 木叶苍蓝 | 来源:发表于2023-07-19 14:11 被阅读0次

    高频问题:应用缓存以后,缓存和数据库何时同步?

    数据不一致问题

    除了少部分配置信息类缓存,比如业务中的黑白名单信息,页面展示配置等
    大部分缓存应用一般是作为前端请求和持久化存储的中间层,承担前端的海量请求


    20230719145240.jpg

    更新缓存有哪些方式

    缓存更新方案是通过对 更新缓存和更新数据这两个操作的设计,实现数据的最终一致性
    前端请求的读操作先从缓存中查询数据,如果没有命中数据,则查询数据库
    从数据库查询成功后,返回结果,同时更新缓存
    如果数据发生了更新操作,必须要考虑如果操作缓存,保证一致性

    先更新数据库,再更新缓存

    在写操作中,先更新数据库,更新成功后,再更新缓存
    由于缓存和数据库是分布式的,更新缓存可能会失败
    会出现数据时新的,缓存中的数据是旧的

    先删除缓存,再更新数据库

    在数据更新时,首先删除缓存,再更新数据库
    假如某次的更新操作,更新了商品详情A 的价格,线程A 进行更新时失效了缓存数据
    线程 B 此时发起一次查询,发现缓存为空,于是查询数据库并更新缓存
    然后线程A 更新数据库为新的价格

    先更新数据库,再删缓存

    经典的缓存+数据库读写的模式,有些资料称它为 Cache Aside 方案
    具体操作:读的时候,先读缓存,缓存没有的话,读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,数据库更新成功之后再删除缓存。

    对缓存更新的思考

    • 在实际业务中,缓存的数据也行来自于多张底层数据表的聚合。比如商品详情信息,如果更新了一个价格字段,就要更新整个数据库
    • 不是所有的缓存数据都是频繁访问的,更新后的缓存可能会长时间不被访问

    更好的方案:更新时删除缓存,等到下次查询命中再填充缓存
    Lazy Loading —— 适用于加载代价大的操作

    多级缓存如何更新

    多级缓存比较难保证数据一致性,通常用在对数据一致性不敏感的业务中
    比如新闻资讯,电商用户评论模块等
    在具体业务中,需要有针对地进行设计

    • 通过给数据添加版本号,或通过时间戳 + 业务主键的方式,控制缓存的数据版本来实现最终一致性
    • 通过 Binlog 异步更新缓存

    相关文章

      网友评论

          本文标题:35. 经典问题——先更新数据库,还是先更新缓存

          本文链接:https://www.haomeiwen.com/subject/cnvnudtx.html