Cache Aside Pattern

简介: 在《究竟先操作缓存,还是数据库?》,有同学在评论提出,相关方案违背了“Cache Aside Pattern”的原则,故今天聊一聊Cache Aside Pattern。

在《究竟先操作缓存,还是数据库?》,有同学在评论提出,相关方案违背了“Cache Aside Pattern”的原则,故今天聊一聊Cache Aside Pattern。

另外,在讨论技术方案时,尽量不说:

“你是错的,应该怎么样”

“facebook不是这样,所以你是错的”

画外音:凭什么facebook就是真理?它的方案只是适合它的业务而已。

说明适用场景,说明来龙去脉,说明前因后果,比具体使用什么方案更重要。

什么是“Cache Aside Pattern”?

答:旁路缓存方案的经验实践,这个实践又分读实践,写实践。

对于读请求

先读cache,再读db

  • 如果,cache hit,则直接返回数据
  • 如果,cache miss,则访问db,并将数据set回缓存

image.png

如上图:

(1)先从cache中尝试get数据,结果miss了

(2)再从db中读取数据,从库,读写分离

(3)最后把数据set回cache,方便下次读命中

画外音:这一点上,与《究竟先操作缓存,还是数据库?》说的是一致的。

对于写请求

  • 淘汰缓存,而不是更新缓存
  • 先操作数据库,再淘汰缓存

image.png

如上图:

(1)第一步要操作数据库,第二步操作缓存

画外音:这一点上,与《究竟先操作缓存,还是数据库?》说的不一致,也是评论反驳比较激烈的地方。

(2)缓存,采用delete淘汰,而不是set更新

画外音:这一点上,与《缓存,究竟是淘汰,还是修改?》说的是一致的。

Cache Aside Pattern为什么建议淘汰缓存,而不是更新缓存?

答:如果更新缓存,在并发写时,可能出现数据不一致。

image.png

如上图所示,如果采用set缓存。

在1和2两个并发写发生时,由于无法保证时序,此时不管先操作缓存还是先操作数据库,都可能出现:

(1)请求1先操作数据库,请求2后操作数据库

(2)请求2先set了缓存,请求1后set了缓存

导致,数据库与缓存之间的数据不一致。

所以,Cache Aside Pattern建议,delete缓存,而不是set缓存。

Cache Aside Pattern为什么建议先操作数据库,再操作缓存?

答:如果先操作缓存,在读写并发时,可能出现数据不一致。

image.png

如上图所示,如果先操作缓存。

在1和2并发读写发生时,由于无法保证时序,可能出现:

(1)写请求淘汰了缓存

(2)写请求操作了数据库(主从同步没有完成)

(3)读请求读了缓存(cache miss)

(4)读请求读了从库(读了一个旧数据)

(5)读请求set回缓存(set了一个旧数据)

(6)数据库主从同步完成

导致,数据库与缓存的数据不一致。

所以,Cache Aside Pattern建议,先操作数据库,再操作缓存。

Cache Aside Pattern方案存在什么问题?

答:如果先操作数据库,再淘汰缓存,在原子性被破坏时:

(1)修改数据库成功了

(2)淘汰缓存失败了

导致,数据库与缓存的数据不一致。

如何解决这类问题呢?

答:详见《究竟先操作缓存,还是数据库?》。

任何技术方案的设计,都是折衷。

只有适合的方案,未必有最优的方案。

技术人,不是被动接受,而要主动思考。

image.png

目录
相关文章
|
SQL 分布式计算 数据管理
12款开源数据资产(元数据)管理平台选型分析(一)
12款开源数据资产(元数据)管理平台选型分析(一)
4557 2
|
4月前
智谱发布GLM-4.5V,全球开源多模态推理新标杆,Day0推理微调实战教程到!
视觉语言大模型(VLM)已经成为智能系统的关键基石。随着真实世界的智能任务越来越复杂,VLM模型也亟需在基本的多模态感知之外,逐渐增强复杂任务中的推理能力,提升自身的准确性、全面性和智能化程度,使得复杂问题解决、长上下文理解、多模态智能体等智能任务成为可能。
762 0
|
4月前
|
人工智能
【千问海报大赛·地方风物】创意征集令!用AI解锁家乡新名片,万元奖金等你来战!
用Qwen-Image打破常规!将家乡的地标、方言、美食或热梗,通过错位混搭(赛博山水×古风建筑?霓虹城市×传统小吃?)或风格化创作(复古卡通、漫画方言…)焕发全新视觉冲击力!
224 10
|
4月前
|
SQL 人工智能 自然语言处理
魔搭社区模型速递(8.2-8.8)
🙋魔搭ModelScope本期社区进展:📟2268个模型📁165个数据集;🎨78个创新应用📄 13篇内容
321 0
|
消息中间件 Java Kafka
Kafka启动遇到ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
Kafka启动遇到ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
1642 0
|
消息中间件
RabbitMQ的 RPC 消息模式你会了吗?
【9月更文挑战第11天】RabbitMQ 的 RPC(远程过程调用)消息模式允许客户端向服务器发送请求并接收响应。其基本原理包括:1) 客户端发送请求,创建回调队列并设置关联标识符;2) 服务器接收请求并发送响应至回调队列;3) 客户端根据关联标识符接收并匹配响应。实现步骤涵盖客户端和服务器的连接、信道创建及请求处理。注意事项包括关联标识符唯一性、回调队列管理、错误处理及性能考虑。RPC 模式适用于构建可靠的分布式应用程序,但需根据需求调整优化。
413 3
|
DataWorks 数据可视化 大数据
DataWorks 产品综合评测报告
《DataWorks产品综合评测报告》全面评估了DataWorks这款知名的大数据开发治理平台。报告从用户画像分析实践、日常工作中的应用、产品体验、与其他工具的对比及Data Studio公测体验等多个角度进行了详细评测。DataWorks在数据集成、可视化操作、任务调度等方面表现出色,但也存在一些技术难题和使用门槛。总体而言,DataWorks功能完整、易用性强,适合企业高效处理和分析大数据,助力决策制定和业务优化。
【Java基础面试十】、何对Integer和Double类型判断相等?
这篇文章讨论了如何在Java中正确比较`Integer`和`Double`类型的值,指出不能直接使用`==`操作符比较不同类型,而应该将它们转换为相同的基本数据类型(如`double`)后进行比较。
【Java基础面试十】、何对Integer和Double类型判断相等?
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
存储 监控 开发者
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
187 0