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

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

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

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

数据不一致问题

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


20230719145240.jpg

更新缓存有哪些方式

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

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

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

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

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

先更新数据库,再删缓存

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

对缓存更新的思考

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

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

多级缓存如何更新

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

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

相关文章

  • 你知道怎么解决DB读写分离,导致数据不一致问题吗?

    目录 前言 先更新数据库,再更新缓存 先更新缓存,再更新数据库 先删除缓存,再更新数据库 先更新数据库,再删除缓存...

  • 缓存与数据库一致性问题

    问题: 应用中用redis或者memcached等DB缓存方案,当更新数据时,是先更新数据库后失效缓存,还是先失效...

  • cache aside pattern(缓存+数据库读写)

    最经典的缓存+数据库读写的模式 1.为甚要先删除缓存再更新数据? 2.要是先更新缓存,要是更新数据库失败怎么办? ...

  • 缓存问题

    一、缓存更新策略 一般情况来说,缓存更新策略有三种: 先删除缓存,后更新数据库 先更新数据库,后更新缓存 先更新数...

  • 缓存⼀致性问题2

    先更新数据库,再删除缓存 如果反过来操作,先更新数据库,再删除缓存呢?这个就更明显的问题了,更新数据库成功,如果删...

  • 缓存读写策略 - Cache Aside

    场景描述 比如一条数据同时存在数据库、缓存,现在你要更新此数据,你会怎么更新? 先更新数据库?还是先更新缓存? 其...

  • 先更新缓存还是先更新数据库

    项目中缓存基本上成为了标配,本地缓存也好、内存数据库缓存也好,只要用了缓存就会涉及数据一致性的问题,这个一致性指的...

  • 先更新缓存还是先更新数据库

    一、提前阅读 讨论这个问题之前可以先看下缓存模式(Cache Aside、Read Through、Write T...

  • 缓存⼀致性问题4

    为什么是删除,⽽不是更新缓存? 我们以先更新数据库,再删除缓存来举例。 如果是更新的话,那就是先更新数据库,再更新...

  • 如何保证Redis与数据库的双写一致性

    1、先更新数据库,再通过订阅binlog异步更新缓存场景:数据实时性要求不是特别高 2、先更新数据库,再删除缓存场...

网友评论

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

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