到底是先更新数据库还是先更新缓存?
大家好,我是冰河~~
最近小伙伴最近都在问我,在系统中引入缓存后,当向数据库中写入数据时,是先写数据库还是先写缓存呢?先写数据库和先写缓存有什么区别吗?今天,我们就一起来聊聊这个话题。
从本质上讲,无论是先写数据库还是先写缓存,都是为了保证数据库和缓存的数据一致,也就是我们常说的数据一致性。
随着互联网的高速发展,当今时代已然从 IT 时代进入到 DT 时代。互联网系统架构也已经由最初的单体架构转变为分布式、微服务架构模式。从数据体量上来看,各系统存储的数据量越来越大,数据的查询性能越来越低。此时,就需要我们不断的进行优化,一种常用的优化手段就是引入缓存。而引入缓存后,我们在向数据库插入数据时,到底是先更新数据库还是先更新缓存呢?
缓存的一般使用
缓存,从本质上讲,是为了更好的协调两个速度差异比较大的组件而引入的一种中间缓存层。例如,如果需要将数据读入 CPU 进行计算处理,由于 CPU 的运算速度是非常快的,而磁盘的 IO 处理相比于 CPU 来说,慢了很多数量级,每次从磁盘读取数据,势会造成 CPU 长时间并且频繁等待磁盘 IO。此时,我们就可以通过内存来缓和 CPU 和磁盘之间的速度差异。
我们也可以表示成如下的序列图。
流程如下所示(1)更新数据库数据;(2)删除缓存数据失败(3)将需要删除的 key 发送至消息队列(4)自己消费消息,获得需要删除的 key(5)继续重试删除操作,直到成功
这种方案有一个缺点,对业务线代码造成大量的侵入。
同步数据库数据
先来一张图,这种图从整体架构上解决了数据库数据和缓存数据不一致的情况。
流程如下图所示:(1)更新数据库数据(2)数据库将数据表数据的变更信息写入 binlog 日志当中(3)订阅程序获取所需要的数据以及 key(4)程序逻辑中处理具体的业务逻辑,接收订阅 binlog、发起删除缓存的请求。(5)尝试删除缓存操作,发现删除失败(6)将这些信息发送至消息队列(7)重新从消息队列中获得该数据,重试操作。
好了,今天就到这儿吧,我是冰河,我们下期见~~
本文文字及图片出自 InfoQ
你也许感兴趣的:
- 【外评】电脑从哪里获取时间?
- 【外评】为什么 Stack Overflow 正在消失?
- Android 全力押注 Rust,Linux 却在原地踏步?谷歌:用 Rust 重写固件太简单了!
- 【外评】哪些开源项目被广泛使用,但仅由少数人维护?
- 【外评】好的重构与不好的重构
- C 语言老将从中作梗,Rust for Linux 项目内讧升级!核心维护者愤然离职:不受尊重、热情被消耗光
- 【外评】代码审查反模式
- 我受够了维护 AI 生成的代码
- 【外评】Linux 桌面市场份额升至 4.45
- 【外评】作为全栈开发人员如何跟上 AI/ML 的发展?
你对本文的反应是: