This is the Trace Id: 122147d68038784e0fc0368004ff1b8b
跳转至主内容
Azure
渐变背景

什么是缓存?

了解缓存如何提升系统性能和效率。

缓存的含义

缓存会在内存中保留可重用的常用数据副本,这样应用程序就能避免重复的数据库调用,并更快返回结果。

关键要点

  • 缓存会将经常请求的数据存储在快速内存中,这样应用就能更快响应,而不必每次都访问主数据库。
  • 典型请求会先检查缓存,然后在未发现请求数据时从源存储中拉取数据,并通过常见的读写模式更新缓存。
  • 如果使用得当,缓存可以降低延迟和后端负载,帮助应对流量高峰,并支持网站、API 和会话状态等常见场景。
  • 缓存出现在多个层面,当你选择稳定的读取密集型数据并保留持久的真实数据源以及回退方案时,缓存效果最佳。

了解缓存

什么是缓存?

缓存是将键值数据存储在内存(例如非相关结构化查询语言 (NoSQL) 数据库)中的做法,因此应用程序可以比从传统存储更快地检索键值数据。在云存储体系结构中(请求通常跨网络和触摸共享服务)中,缓存可帮助减少响应时间并减少重复工作。

缓存的工作原理是什么?

大多数系统为完整数据集保留持久的“事实源”(数据库),然后为经常读取的临时子集保留缓存。收到请求时,应用会先检查缓存;如果数据已存在,就会直接快速返回,而不会再次查询后端。开发者还会缓存处理后的数据,并重复使用该数据,以便比标准查询更快地为关系数据库SQL 数据库或开源 PostgreSQL 数据库提供请求响应。

缓存背后的关键原则

1. 缓存经常读取的内容

合适的候选数据包括经常读取且变化不频繁的数据(例如产品和定价信息,或构建成本较高的共享静态资源)。

2. 缓存重复工作的结果

如果某个操作会转换数据或执行复杂计算,那么缓存结果可以避免对后续请求重复计算。

3. 按需使用缓存层

开发者根据需要使用多层缓存(“缓存层”)将不同类型的数据存储在单独的缓存中。添加一个或多个缓存层可以提升数据层的吞吐量和延迟性能。

4. 将会话状态就近留存,打造响应式应用‌

内存存储常用于短时间保存大量会话数据,例如用户输入、购物车条目或个性化首选项。对于有状态应用,团队还会将会话状态存储在缓存中,这样应用就可以保持无状态。

对系统性能的影响

缓存可以通过几种具体方式提升性能:

  • 从内存中缓存读取数据比从磁盘驱动的存储访问数据的速度更快。
  • 减少查询可以降低负载,并减少扩展数据库基础结构的需求,这也可以降低成本。
  • 缓存层可以提升吞吐量和延迟性能,而内存缓存有助于缓解使用高峰期间的延迟。
  • 一个缓存实例每秒可以处理数百万个请求,提供许多数据库无法匹敌的吞吐量。

缓存的工作原理是什么?

基本流程:缓存 + 源数据存储

在许多设计中,缓存位于主数据存储(例如数据库)旁边。主存储在云服务器上保存完整的持久数据集,而缓存保留更小的临时子集,可更快地读取。

一种常见设置是独立的缓存层,或者位于应用层或数据库层中的缓存 - 具体选择取决于你需要在哪一层进行快速读取。

缓存层:不止一条“快速路径”

某些系统会使用多级缓存(“缓存层”),让不同类型的数据根据需求存放在不同的缓存中。添加一个或多个缓存层可以提升数据层的吞吐量和延迟性能,并通过减少后端负载降低整体成本。

哪些内容会被缓存(以及原因)

团队通常会缓存以下几类数据:

  • 经常读取的数据(尤其是变化不频繁的数据),例如产品或定价信息,以及构建成本较高的共享静态资源。
  • 重复计算,即某个操作会转换数据或执行复杂计算 - 缓存结果可以避免对后续请求重复执行相同工作。
  • 会话状态,适用于有状态应用;将会话状态存储在缓存中可以帮助应用层保持无状态。

常见缓存模式(读/写工作流)

应用可通过多种标准方式从缓存读取和写入缓存。以下是一些最常见的模式及其在实践中的含义。

  • 旁路缓存:按需从数据存储加载数据。
  • 通读:先从缓存读取,如有需要,缓存会从数据存储中获取数据。
  • 直写:先写入缓存,然后同步地重新与数据存储进行同步。
  • 写回(后写):先写入缓存,再分批写回数据存储。
  • 绕写:先写入数据存储,再从缓存读取;缓存按需更新。

为什么这能减少负载并加快速度

使用缓存层可以通过从缓存中提供常见请求,而不是反复查询后端存储,提高吞吐量并降低延迟。这可以降低扩展数据库基础结构的需求,因为一开始到达数据库的请求更少。

对于使用量会激增的应用,内存缓存可以通过让频繁请求的数据靠近使用位置来帮助缓解延迟。

快速指南:选择一种模式

选择工作流时,可以先从以下方面入手:

  • 如果应用可以决定要存储什么内容以及何时刷新,优先选择“旁路缓存”。
  • 如果希望缓存负责“按需”从数据存储中提取数据,优先选择“通读”。
  • 当写入行为很重要,并且你需要明确的重新同步方法时,可以考虑“直写”或“写回”。

缓存的益处和应用

在减少后端工作的同时加快响应

缓存可以提升应用程序性能,因为从内存缓存读取比从磁盘驱动的数据存储读取更快。当更多请求由缓存提供时,系统发送到后端数据库的查询更少,这可以降低扩展数据库基础结构的需求,并减少相关成本。

通常可从缓存中获得的益处
  • 常见读取的延迟更低,因为频繁请求的数据来自更快的层。
  • 数据库负载和成本更低,因为缓存会减少数据库查询,并降低过度预配数据库实例的压力。
  • 吞吐量可预测性更强,因为与许多数据库相比,缓存可以处理非常高的请求量。
  • 处理流量峰值更平稳,因为内存缓存可以在高吞吐量期间缓解延迟。

更高效地使用计算和存储资源

缓存有助于减少重复工作。重复读取的数据 - 或者构建成本很高的数据 - 可以只存储一次并重复使用。如果某个操作会执行复杂计算或转换数据,缓存结果可以减少对后续请求的重复计算。

常见的“适合缓存”候选数据
  • 变化不频繁的数据(例如产品和定价信息)。
  • 构建成本很高的共享静态资源。
  • 会被重复计算的操作结果。

实际应用(缓存会出现在哪些场景)

网站:页面加载更快且重复工作更少

许多网站会缓存页面输出(例如 HTML 和客户端脚本),这样服务器就可以返回缓存的输出,而不是每次都重新运行页面代码。缓存还通过 Web 缓存和网络缓存支持 Web 多媒体场景,例如内容分发网络 (CDN)。

网站上的典型用法
  • 缓存整页输出以获得重复视图。
  • 通过网络/CDN 缓存,缓存静态资源。
应用和 API:更快的读取共享数据

应用通常会将数据的临时子集存储在缓存中,以便快速检索,而主数据库保留完整且持久的数据集。缓存经过处理的数据并重复使用,可比标准数据库查询更快地响应请求。

常见应用模式
  • 缓存经常读取的参考数据(例如定价),以减少重复的数据库调用。
  • 缓存计算结果,以避免重复执行耗时工作。
服务器和服务:扩展读取并平滑峰值

团队通常会添加一个或多个缓存层来提升吞吐量和延迟性能,通过缓存提供常见查询并减少数据库负载。当使用量激增且吞吐量需求上升时,内存缓存可以帮助缓解这些时段的延迟。

这在什么场景下最有帮助
  • 读取频率高且经常请求相同键的终结点。
  • 会出现周期性流量高峰的系统。
业务系统:会话状态和共享运营数据

缓存通常用于在内存存储中保存大量短期会话数据(例如用户输入或个性化首选项)。有些团队还会将会话状态存储在缓存中,这样有状态应用便可使应用层保持无状态。对于运营系统,变化不频繁的数据(例如产品和定价信息)是常见的缓存目标。

可映射到业务工作负载的示例
  • Web 和移动应用的会话数据(短期、大容量)。
  • 经常读取的运营参考数据(定价、共享资源)。

缓存类型

缓存出现在应用与其数据之间的多个层中,包括客户端和服务器端方法。

浏览器缓存(客户端)

浏览器缓存会将静态资源的副本存储在用户设备上,这样再次访问时就可以重复使用这些文件,而无需重新下载。

常见用例
  • 静态站点资产,例如图像、CSS 文件和 JavaScript 文件。
  • 对于先前获取过的资源,减少重复访问源服务器的需求。

服务器端缓存

服务器端缓存发生在远程运行业务服务的进程中,而不是在最终用户的设备上。服务器端缓存通常是私有的(仅限一个应用实例本地)或共享的(供多个应用实例使用)。

常见用例
  • 单个进程中的私有内存缓存,用于存储适量静态数据。
  • 共享缓存服务,可让多个应用实例读取相同的缓存值,并避免实例之间出现“不同版本”。
  • 经常读取但很少修改的数据(例如产品和定价参考数据)。

CDN 缓存

CDN 会在更靠近最终用户的边缘服务器上缓存内容,这样请求就不必总是回传到源位置。与浏览器缓存(单个用户)不同,CDN 缓存是共享的 - 一位用户的请求可以填充内容,供另一位用户稍后接收。

常见用例
  • 从边缘位置共享分发可缓存内容,以减少对源位置的请求。
  • 适合在靠近用户的位置提供的静态资源(与浏览器缓存的资产类型相同,但可跨用户共享)。

CPU/内存缓存

缓存不仅是一种云计算模式,硬件和内存层也使用该功能。

CPU 缓存是处理器附近(或位于处理器上的)的小型快速内存区域,用于存储常用数据和指令的副本,从而减少等待主内存的时间。

内存(内存中)缓存是最简单的软件缓存类型:它是保存在单个进程地址空间中的内存中存储,并由该进程直接访问。

常见用例
  • CPU 缓存:无需频繁访问主内存即可重复访问相同的指令/数据。
  • 内存中缓存:在单个正在运行的服务中,快速读取适量的相对静态数据。

分布式缓存

分布式缓存跨多个服务器,因此缓存容量和事务处理能力都能超出单台计算机。许多共享缓存服务会使用服务器群集,并在群集中分发缓存数据;扩展缓存可以像添加更多服务器一样简单。一些分布式设计还会对缓存进行分层,当某一层没有请求数据时,会从上游提供程序获取数据,然后将结果本地存储供下次请求使用。

常见用例
  • 面向多个应用实例和计算机的共享缓存层。
  • 需要超出单个主机的缓存容量和吞吐量的工作负载。
  • 分层缓存设置,在未找到请求数据时从上游获取数据,然后保留本地副本供后续请求使用。

缓存入门

为什么缓存仍然很重要

缓存可将频繁访问的数据放在更接近使用位置的地方,从而缩短响应时间,并帮助系统处理更多并发请求。它还可以减少原始数据存储中的争用,例如数据库连接数有限时。

在分布式应用程序中,缓存通常会出现在多个位置 - 客户端(例如浏览器)和服务器端(在应用程序或共享缓存服务中)。

一种实用的入门方式

从小处着手,专注于能带来最明显回报的数据:

  • 缓存读取密集型、提取速度慢且变化不频繁的数据(例如参考数据)。
  • 确定数据何时进入缓存:
    • 在第一次请求后按需缓存,以便仅只存储实际使用的数据。
    • 如果你知道某些项会在早期被请求,可以在启动时预先填充(播种)一些项 - 同时注意原始存储的启动负载。
  • 选择你能管理的模式。旁路缓存模式很常见,其指导意义在于强调过期、逐出和一致性如何影响结果。

保持缓存数据的新鲜度(并让系统具有可复原能力)

缓存通常保存主存储中的数据副本,因此需要关注新鲜度:

  • 使用过期策略,限制数据在缓存中保留的时间,之后再刷新。
  • 注意缓存填满时的逐出行为(许多系统会默认逐出最近最少使用的项)。
  • 不要把缓存当作关键数据的唯一存储位置。将事实源保留在持久化存储中,这样在缓存不可用时系统仍可继续运行。
  • 规划在无法访问缓存时到原始数据存储的回退路径,并在发生读取时重新填充缓存。

缓存是现代系统的核心构建基块,因为它适用于多种体系结构 - 从单个服务到分布式应用和边缘交付。对于托管的内存中缓存云服务提供商,可以浏览 Azure

渐变背景
资源

资源

培训
Azure 资源
探索最新的开发者技术并学习新技能。
教育
学生开发者资源
获得技能来快速开始职业生涯,并为世界带来积极影响。
活动
Azure 活动和网络研讨会
学习新技能,发现新技术,并与社区建立联系 - 以数字方式或亲自参加。
常见问题解答

常见问题解答

  • 缓存会将频繁访问的数据保存在快速内存中,这样应用每次无需访问主数据库即可快速返回结果。这可以降低延迟和后端负载,有助于系统处理更多并发请求。
  • 缓存通过从快速内存提供频繁请求的数据来提升性能,这可以降低延迟、减少数据库负载和成本、支持高请求量,并有助于应对流量高峰。
  • 一个示例是输出缓存 - Web 服务器将页面呈现的输出(HTML 和客户端脚本)存储在内存中,然后在重复访问时直接提供该缓存输出,而不是重新运行页面代码。
  • 缓存存储小部分临时数据子集以实现快速访问;而数据库或存储保存完整且持久的数据集,用于长期保留。如果缓存数据丢失,永久副本仍然保存在数据库中;缓存并非旨在用作关键数据的权威存储空间。