概述

在系统架构中,缓存可谓提供系统性能的最简单方法之一,稍微有点开发经验的同学必然会与缓存打过交道,最起码也实践过。

如果使用得当,缓存可以减少响应时间、减少数据库负载以及节省成本。但如果缓存使用不当,则可能出现一些莫名其妙的问题。

在不同的场景下,所使用的缓存策略也是有变化的。如果在你的印象和经验中,缓存还只是简单的查询、更新操作,那么这篇文章真的值得你学习一下。

在这里,为大家系统地讲解4种缓存模式以及它们的使用场景、流程以及优缺点。

缓存策略的选择

本质上来讲,缓存策略取决于数据和数据访问模式。换句话说,数据是如何写和读的。

例如:

  • 系统是写多读少的吗?(例如,基于时间的日志)

  • 数据是否是只写入一次并被读取多次?(例如,用户配置文件)

  • 返回的数据总是唯一的吗?(例如,搜索查询)

选择正确的缓存策略才是提高性能的关键。

常用的缓存策略有以下五种:

  • Cache-Aside Pattern:旁路缓存模式

  • Read Through Cache Pattern:读穿透模式

  • Write Through Cache Pattern:写穿透模式

  • Write Behind Pattern:又叫Write Back,异步缓存写入模式

上述缓存策略的划分是基于对数据的读写流程来区分的,有的缓存策略下是应用程序仅和缓存交互,有的缓存策略下应用程序同时与缓存和数据库进行交互。因为这个是策略划分比较重要的一个维度,所以在后续流程学习时大家需要特别留意一下。

Cache Aside

Cache Aside是最常见的缓存模式,应用程序可直接与缓存和数据库对话。Cache Aside可用来读操作和写操作。

读操作的流程图:

Cache Aside Pattern

读操作的流程:

  • 应用程序接收到数据查询(读)请求;

  • 应用程序所需查询的数据是否在缓存上:

    • 如果存在(Cache hit),从缓存上查询出数据,直接返回;

    • 如果不存在(Cache miss),则从数据库中检索数据,并存入缓存中,返回结果数据;

这里我们需要留意一个操作的边界,也就是数据库和缓存的操作均由应用程序直接进行操作。

写操作的流程图:

Cache Aside Pattern

这里的写操作,包括创建、更新和删除。在写操作的时候,Cache Aside模式是先更新数据库(增、删、改),然后直接删除缓存。

Cache Aside模式可以说适用于大多数的场景,通常为了应对不同类型的数据,还可以有两种策略来加载缓存:

  • 使用时加载缓存:当需要使用缓存数据时,从数据库中查询出来,第一次查询之后,后续请求从缓存中获得数据;

  • 预加载缓存:在项目启动时或启动后通过程序预加载缓存信息,比如”国家信息、货币信息、用户信息,新闻信息“等不是经常变更的数据。

Cache Aside适用于读多写少的场景,比如用户信息、新闻报道等,一旦写入缓存,几乎不会进行修改。该模式的缺点是可能会出现缓存和数据库双写不一致的情况。

Cache Aside也是一个标准的模式,像Facebook便是采用的这种模式。

Read Through

Read-Through和Cache-Aside很相似,不同点在于程序不需要关注从哪里读取数据(缓存还是数据库),它只需要从缓存中读数据。而缓存中的数据从哪里来是由缓存决定的。

Cache Aside是由调用方负责把数据加载入缓存,而Read Through则用缓存服务自己来加载,从而对应用方是透明的。Read-Through的优势是让程序代码变得更简洁。

这里就涉及到我们上面所说的应用程序操作边界问题了,直接来看流程图:

Read Through

在上述流程图中,重点关注一下虚线框内的操作,这部分操作不再由应用程序来处理,而是由缓存自己来处理。也就是说,当应用从缓存中查询某条数据时,如果数据不存在则由缓存来完成数据的加载,最后再由缓存返回数据结果给应用程序。

Write Through

在Cache Aside中,应用程序需要维护两个数据存储:一个缓存,一个数据库。这对于应用程序来说,有一些繁琐。

Write-Through模式下,所有的写操作都经过缓存,每次向缓存中写数据时,缓存会把数据持久化到对应的数据库中去,且这两个操作在一个事务中完成。因此,只有两次都写成功了才是最终写成功了。坏处是有写延迟,好处是保证了数据的一致性。

可以理解为,应用程序认为后端就是一个单一的存储,而存储自身维护自己的Cache。

因为程序只和缓存交互,编码会变得更加简单和整洁,当需要在多处复用相同逻辑时这点就变得格外明显。

Write Through

当使用Write-Through时,一般都配合使用Read-Through来使用。Write-Through的潜在使用场景是银行系统。

Write-Through适用情况有:

  • 需要频繁读取相同数据

  • 不能忍受数据丢失(相对Write-Behind而言)和数据不一致

在使用Write-Through时要特别注意的是缓存的有效性管理,否则会导致大量的缓存占用内存资源。甚至有效的缓存数据被无效的缓存数据给清除掉。

Write-Behind

Write-Behind和Write-Through在”程序只和缓存交互且只能通过缓存写数据“这方面很相似。不同点在于Write-Through会把数据立即写入数据库中,而Write-Behind会在一段时间之后(或是被其他方式触发)把数据一起写入数据库,这个异步写操作是Write-Behind的最大特点。

数据库写操作可以用不同的方式完成,其中一个方式就是收集所有的写操作并在某一时间点(比如数据库负载低的时候)批量写入。另一种方式就是合并几个写操作成为一个小批次操作,接着缓存收集写操作一起批量写入。

异步写操作极大地降低了请求延迟并减轻了数据库的负担。同时也放大了数据不一致的。比如有人此时直接从数据库中查询数据,但是更新的数据还未被写入数据库,此时查询到的数据就不是最新的数据。

小结

不同的缓存模式有不同的考量点和特征,根据应用程序需求场景的不同,需要灵活的选择适配的缓存模式。在实践的过程中往往也是多种模式相结合来使用。

往期推荐

保证接口数据安全的10种方案

聊聊异步编程的 7 种实现方式

阿里出品,SpringBoot自动化部署神器!

4种常见的缓存模式,你都知道吗?相关推荐

  1. 10种常见的软件架构模式-快速记忆

    10种常见的软件架构模式-快速记忆 这里通过数字宫殿的方法快速记忆10种常见的设计模式,通过记忆名字+理解的情况下熟悉常见的软件架构模式 文章目录 10种常见的软件架构模式-快速记忆 前言 一.快速记 ...

  2. 五种常见的电子商务模式

    五种常见的电子商务模式对比:B2B.B2C.C2B.C2C.O2O 电子商务模式是指企业运用互联网开展经营取得营业收入的基本方式,也就是指在网络环境中基于一定技术基础的商务运作方式和盈利模式.目前,常 ...

  3. 五种常见的电子商务模式对比:B2B、B2C、C2B、C2C、O2O

    电子商务模式是指企业运用互联网开展经营取得营业收入的基本方式,也就是指在网络环境中基于一定技术基础的商务运作方式和盈利模式.目前,常见的电子商务模式主要有B2B.B2C.C2B.C2C.O2O等几种, ...

  4. 五种常见的电子商务模式:B2B、B2C、C2B、C2C、O2O

    之前在网络和媒体上频繁的听到这些词,也时常听到一些IT大佬们聊到这些词,但是一直都不清楚这些词具体的含义,有什么区别,最近觉得有必要去了解一下,所以特自到网上搜罗了一些资料,也顺便普及一下相关的知识和 ...

  5. java如何解决缓存问题_4种常见的缓存问题及解决方案详解

    前言 使用缓存可以缓解大流量压力,显著提高程序的性能.我们在使用缓存系统时,尤其是大并发情况下,经常会遇到一些"疑难杂症".本文总结了一些使用缓存时常见的问题及解决方案,以后在遇到 ...

  6. 10种常见的软件架构模式

    有没有想过要设计多大的企业规模系统?在主要的软件开发开始之前,我们必须选择一个合适的体系结构,它将为我们提供所需的功能和质量属性.因此,在将它们应用到我们的设计之前,我们应该了解不同的体系结构. 什么 ...

  7. 5种常见的电子商务模式

    电子商务模式 是指企业运用互联网开展经营取得营业收入的基本方式,也就是指在网络环境中基于一定技术基础的商务运作方式和盈利模式.目前,常见的电子商务模式主要有B2B.B2C.C2B.C2C.O2O等几种 ...

  8. PPP项目的含义和几种常见的PPP模式

    近几年来,国家陆续开展PPP项目的实施,所以我们经常在电视和新闻上看到"PPP模式"和"PPP项目"   更有"PPP概念股"在慢慢的冲击大 ...

  9. 散粒噪声是白噪声吗_5种常见的内部噪声,你都清楚吗?

    噪声重要与否,取决于它对目标电路工作的影响程度. 例如,一个开关电源在3 MHz时具有显著的输出电压纹波,如果它为之供电的电路仅有几Hz的带宽,如温度传感器等,则该纹波可能不会产生任何影响.但是,如果 ...

最新文章

  1. 2022-2028年中国异戊二烯橡胶产业竞争现状及发展规模预测报告
  2. docker容器内部无法ping通域名?
  3. GPSInfoProvider定位
  4. mac环境下安装xampp
  5. Python的线性查找(作业)
  6. 【完整代码】使用Semaphore实现线程的交替执行打印 A1B2C3D4E5
  7. CSS 七层叠层顺序(stacking level)
  8. 浅谈城市规划在移动GIS方面的应用发展
  9. 1. JavaScript学习笔记——JS基础
  10. (16)Verilog HDL常量:数值表示
  11. linux下比较文件并输出,Linux使用diff命令比较文件的方法
  12. 三、Nginx内置变量
  13. matlab建模仿真教学视频教程,仿真建模与MATLAB
  14. pycharman使用小结
  15. C语言-----职工信息管理系统
  16. log日志查看软件logviewer-pro
  17. JQuery的选择器对控件ID含有特殊字符的解决方法
  18. 9.查找算法--二叉排序树
  19. 享学独立站:Logo设计理念
  20. CentOS7安装Nextcloud+ocDownloader+aria2使用Nextcloud网盘做离线下载服务器

热门文章

  1. kali linux学习笔记(四) : 网络端口大全介绍
  2. 大量短视频怎么批量添加个人logo呢?
  3. 博弈收银系统源码升级了,是一套仿有赞模式的多门店管理软件
  4. 存货账龄分析报表(中三)
  5. 优思学院|浅谈全面质量管理
  6. RSA公钥密码体制的简介及例题
  7. 第五章 公钥密码体制
  8. 信息安全等级保护划分五级及等保级别适用行业...
  9. iOS苹果内购流程(Apple Pay)
  10. TP_LINK AP和CPE连接配置