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

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

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

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

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

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

什么是“Cache Aside Pattern”?

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

对于读请求

  • 先读cache,再读db

  • 如果,cache hit,则直接返回数据

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

如上图:

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

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

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

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

对于写请求

  • 淘汰缓存,而不是更新缓存

  • 先操作数据库,再淘汰缓存

如上图:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(1)写请求淘汰了缓存

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

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

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

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

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

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

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

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

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

(1)修改数据库成功了

(2)淘汰缓存失败了

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

如何解决这类问题呢?

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

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

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

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

相关推荐:

《进程内缓存,究竟怎么玩?》

《选redis还是memcache,源码怎么说?》

《缓存,你真的用对了么?》

《缓存,究竟是淘汰,还是修改?》

《缓存,并发更新的大坑?》

《数据库主从不一致,怎么解?》

《究竟先操作缓存,还是数据库?》

文字很短,希望大家有启示,求帮转。

Cache Aside Pattern相关推荐

  1. 缓存读写策略 Cache Aside Pattern,开发必备

    我们在前面讲到了当我们业务面临大量写并发的时候,将数据库开发成分布式存储系统,然后又介绍了NoSql数据库与关系型数据库互相配合,以用来更好的服务与我们的业务发展.但随着并发的持续增加,存储数据量的增 ...

  2. Cache Aside Pattern(缓存模式)

    本文主要讨论这么几个问题: (1)"缓存与数据库"需求缘起 (2)"淘汰缓存"还是"更新缓存" (3)缓存和数据库的操作时序 一.需求缘起 ...

  3. 常用缓存读写策略(cache读写策略)

    文章目录 前言 一.Cache Aside Pattern (旁路缓存模式) 二.Read/Write Through Pattern(读写穿透模式) 三.Write Behind Pattern(异 ...

  4. 缓存模式(Cache Aside、Read Through、Write Through、Write Behind)

    概览 缓存是一个有着更快的查询速度的存储技术,这里的更快是指比起从初始的数据源查询(比如数据库,以下都称作数据库)而言.我们经常会把频繁请求的或是耗时计算的数据缓存起来,在程序收到请求这些数据的时候可 ...

  5. 缓存更新的Design Pattern -- 缓存专题(2)

    黄粱一梦终须醒, 无根无极本归尘. 金龙飞天归何处, 不如凡间做真人! 上个周忙活了一周上线工作,因为银行的行业性质,与国家安全.国家政策强相关.所以对上线版本的质量要求都很高,因而每一次上线前担惊害 ...

  6. [由零开始]Guava Cache介绍和用法

    Guava Cache介绍 Guava是Google提供的一套Java工具包,而Guava Cache是一套非常完善的本地缓存机制(JVM缓 存). Guava cache的设计来源于CurrentH ...

  7. Guava Cache介绍

    1.缓存回顾: 使用场景:互联网,数据越来越多,用户越来越多,并发量.吞吐量越来越大 使用数据库存储,分库分表,也不能满足要求,使用缓存,减轻数据库的压力 临时存储的数据 其他的场景:Session分 ...

  8. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

  9. 面试:高频面试题:如何保证缓存与数据库的双写一致性?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | blog.csdn.net/chang384915878 ...

最新文章

  1. 追一科技热招职位来袭:AI新世界,不做旁观者
  2. CTreeCtrl的用法
  3. 有什么好一点的方法读jdk源码吗?
  4. 中国兽医牙科X射线发生器市场趋势报告、技术动态创新及市场预测
  5. m_map投影_MATLAB——m_map指南(1)
  6. Linux 安装flash
  7. CAD图纸被加密了,如何打开?
  8. 实用小软件实现Mac读写ntfs U盘 移动硬盘
  9. Linux命令怎么查找IP,在Linux中,如何查找您的IP地址
  10. FRP分享 Padavan
  11. 用word模板制作幻灯片
  12. 网站留言板防重复留言_公众号留言板怎么弄
  13. ServiceMesh和SideCar
  14. 操作系统_逻辑地址转换为物理地址
  15. mac微信备份位置macos手机微信备份的文件迁移走
  16. mac安装adb报错Unknown command: cask
  17. Python——CSV读取大文件报错_csv.Error: field larger than field limit
  18. 这些常用的java工具类你都知道吗?
  19. 艺术留学|服装设计专业2019院校排名
  20. 巧用TWaver 3D 矢量图形功能

热门文章

  1. 全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)
  2. MiniGUI编程速查表
  3. 鸿蒙系统和安卓哪个更流畅,鸿蒙系统与安卓系统的区别 鸿蒙系统与安卓系统哪个更好[图]...
  4. ⚡爬虫高级篇⚡五行代码识别验证码—— ddddocr(带带弟弟OCR)
  5. 圣诞节高清Mac动态壁纸
  6. java 构造函数和super
  7. photoswipe
  8. python综合实验报告_Python程序设计 实验报告
  9. CSP-S2022 游记
  10. Python画各种有趣的图及源码