什么是缓存?缓存数据如何提升速度
现代CPU可以在不到一纳秒的时间内从最近的缓存中读取一个值。而从主内存读取同一个值则需要大约一百倍的时间。因此,芯片会采取一种显而易见的做法:在自身附近保存一份可能需要的数据副本。这份副本就是缓存,这种技巧在计算的各个层面上都会重复使用,从处理器中的芯片到提供此页面的服务器。本指南将解释什么是缓存、缓存的工作原理、缓存存在于哪些地方,以及是否应该清除缓存。
缓存定义:缓存的真正含义
缓存是一种临时存储。它体积小、速度快,并且尽可能靠近需要它的地方。它保存着系统预期会再次访问的数据副本,这样当需要时,系统就可以直接检索副本,而无需重新执行缓慢或耗时的操作。例如,如果您再次打开此页面,其中很大一部分内容将从您计算机上已有的副本加载,而不是从服务器加载。
“临时”二字在这里发挥了关键作用。缓存数据永远不是原始数据。它只是一个副本,纯粹是为了提高速度而保留的,你可以随时将其删除。即使你删除了它,也不会丢失任何有价值的信息。系统会重新从真正的数据源获取并重建副本。你的银行余额不会存储在缓存中;显示该余额的网页副本可能会。正是由于真实数据源和临时副本之间存在这种差异,缓存才能够安全地应用于所有场景。最坏的情况是,副本丢失或错误,系统也只会耸耸肩,从数据源重新获取数据,然后继续运行。
缓存的工作原理:缓存命中、缓存未命中和缓存驱逐
所有缓存,无论在哪里,都基于一个问题运行:我是否已经拥有此数据的副本?如果答案是肯定的,则意味着快速响应。直接提供副本,跳过耗时的路径,完成。如果答案是否定的,则意味着执行一次耗时的操作:从源头获取数据,返回结果,并在返回时保留一份副本,以便后续请求能够快速响应。这就是整个机制。其余部分都是围绕两个棘手问题进行的簿记工作,即当缓存空间不足时如何丢弃数据,以及如何避免返回已过期的副本。
缓存命中与缓存未命中
找到了?缓存命中。没找到?缓存未命中,这会导致请求访问速度较慢的后端服务器。请求命中率是指所有请求中成功的比例,也是工程师真正关注的指标。内容分发网络(CDN)提供静态文件(例如图片和样式表)时,目标是达到 95% 到 99% 的命中率。如果达到这个目标,几乎所有访问者都能获得一个本地副本,而源服务器几乎不会被访问。命中率低则意味着缓存基本上形同虚设。
缓存填满时:驱逐策略
缓存故意设置得比较小。快速存储需要成本,所以缓存空间永远不可能容纳所有数据,一旦缓存满了,就必须删除一些数据。决定哪些数据会被删除的规则就是驱逐策略。通常的默认策略是最近最少使用(LRU):删除那些长时间未被访问的数据,因为人们会认为最近忽略的数据还会继续被忽略。其他策略的计算方式则不同。最少使用(LFU)会跟踪每个数据的访问频率。先进先出(FIFO)则直接删除最旧的条目。本质上都是同样的赌博,只是策略不同而已。每种策略实际上都是在猜测哪个副本丢失的损失最小。
保持副本有效:TTL 和写入策略
副本只有在与源文件完全匹配时才有效。因此,大多数缓存都会为每个条目添加一个生存时间(TTL):一个倒计时,超过倒计时后,副本即被视为过期,需要重新检查或重新获取。在 Web 上,Cache-Control 标头设置了该时间。相关规则是RFC 9111 ,其 max-age 指令允许响应在缓存中保留长达一年,或者如果您需要精确数字,则是 31,536,000 秒。写入操作是问题的另一半。直写式 (Write-through) 同时将数据保存到缓存和源文件,这种方式安全但速度较慢。回写式 (Write-back) 先将数据保存到缓存,稍后再保存到源文件,这种方式速度很快,但会在缓存和源文件之间留下短暂的不一致时间。您需要权衡利弊。

缓存类型:从 CPU 到内容分发网络
大多数解释都忽略了这一点。浏览器缓存和L1 CPU缓存听起来像是截然不同的概念——但实际上它们只是在不同的层面上实现了相同的功能。每一层缓存都将访问速度较慢的数据副本保存在靠近需要它的设备的位置。从内到外,沿着缓存层层递进,你会发现这种模式始终如一。
内存缓存:CPU缓存级别 L1、L2、L3
最快的缓存发生在处理器本身。现代 CPU 拥有三级缓存,由 SRAM 构成。SRAM 是一种比主内存使用的 DRAM 快得多的内存类型,但每字节的成本也高得多。L1 缓存容量很小,几乎是瞬时的,每个核心只有几十 KB 的缓存,响应时间大约在一纳秒左右。L2 缓存容量更大,速度稍慢。L3 缓存容量更大,并且是跨核心共享的; 英特尔酷睿 i9-14900K配备了 36 MB 的 L3 缓存,而 AMD 的 Ryzen 9 7950X3D 则将 L3 缓存容量提升到了 128 MB。所有这些都是为了弥补一个差距:从 L1 缓存中读取数据只需不到一纳秒,而从 DDR5 主内存中读取数据则需要大约 70 秒,两者相差近百倍。缓存之所以有效,是因为程序会重用相同的数据以及与其相邻的数据,这种特性被称为“局部性”。
| 层 | 典型尺寸 | 典型访问时间 | 它包含什么 |
|---|---|---|---|
| L1 CPU缓存 | 每个核心 32-80 KB | 约0.7-1纳秒 | 接下来的指令和值 |
| L2 CPU缓存 | 每个核心 0.5-2 MB | 约3-4纳秒 | 最近使用的核心附近数据 |
| L3 CPU缓存 | 共享 16-128 MB | 约10-20纳秒 | 核心间共享的数据 |
| 主内存(RAM) | 8-64 GB | 约70-100纳秒 | 运行程序和活动数据 |
| SSD存储 | 256 GB-4 TB | 约50-100微秒 | 文件和操作系统 |
| CDN边缘节点 | 变化 | 网络传输时间约为 20 毫秒 | 访客附近的网页副本 |
| 源服务器 | 变化 | 跨区域约100-200毫秒 | 真理之源 |
磁盘、操作系统和应用程序缓存
在硬件之上,软件也维护着自己的缓存。操作系统会将频繁访问的数据(例如最近读取的文件)保存在空闲的内存中,以便快速重新打开它们。数据库会缓存常用查询的结果。应用程序会添加一个专用的内存缓存层,通常是 Redis 或 Memcached,它位于应用程序和数据库之间,能够以微秒级的速度响应重复请求。这项工作与 CPU 的工作原理相同:将常用数据保存在速度更快的存储介质中,避免因速度慢而付出两次代价。
服务器端缓存和 CDN
最外层覆盖整个互联网。当网络服务器缓存已完成的页面时,它避免了为每个访问者重新构建页面。内容分发网络 (CDN) 更进一步,将这些资源复制到遍布全球的边缘服务器上,从而确保每个请求都能由距离用户最近的服务器响应。CDN 边缘服务器的响应时间约为 20 毫秒,而如果请求必须跨越大陆到达源服务器,则需要 100 到 200 毫秒。这种模式如今已主导了互联网:到 2024 年,大约75% 的第三方内容将通过 CDN 提供。
浏览器缓存:您的网络浏览器存储的内容
浏览器缓存是大多数人实际接触到的缓存机制。加载网站时,浏览器会悄悄地将网站的部分内容(例如 HTML 代码、样式表、脚本、图片和字体)缓存到你的设备上。下次访问时,浏览器会直接从你的硬盘读取这些文件,而无需重新下载,这就是为什么第二次访问网页比第一次打开速度更快的原因。网站的 logo 呢?下载一次,就可以在所有显示它的页面上重复使用。
最让我感到困惑的是:大部分速度优势都被白白浪费了。截至 2021 年,约90.4% 的桌面网页响应都可以缓存,但仍有 52% 的网站在标准浏览器缓存审核中排名低于 25%。如此巨大的优势就摆在那里,唾手可得,却被大多数网站视而不见。正确设置缓存,回报立竿见影。重复访问速度更快,移动数据使用量更低,源服务器也不再需要处理重复的请求。

缓存的好处:为什么它能加快速度
缓存是一种权衡。你需要占用少量内存,并承担提供略微过时数据的风险,作为回报,你可以获得更快的速度、更低的负载和更低的成本。正是这三点优势使得缓存技术出现在每一层,而不仅仅是某一层。
速度优势显而易见:从附近的存储设备提供副本比重新计算结果或通过网络传输要快得多。第二个优势是降低了源服务器的负载。缓存响应的每个请求都意味着数据库或源服务器无需处理,从而确保系统在流量高峰期也能正常运行。第三个优势是成本优势:从边缘节点提供缓存的数据比从中央服务器生成并传输数据更经济,而且当需要重复访问数据时,这种节省会迅速累积。
应用性能提升带来的用户体验提升是真实且可衡量的。谷歌2018年针对移动网站的研究发现,加载时间缩短一秒就能将转化率提升高达27%,而广为引用的2012年Aberdeen Group的研究表明,页面延迟一秒会导致转化率下降7%。更快的页面加载速度能够留住用户。缓存是实现这一目标最经济有效的方法之一。
| 缓存类型 | 它居住的地方 | 它储存了什么 | 谁来管理它 | 典型寿命 |
|---|---|---|---|---|
| CPU缓存(L1/L2/L3) | 在处理器上 | 热点指令和数据 | 硬件,自动 | 微秒 |
| 浏览器缓存 | 您的设备 | HTML、CSS、JS、图片、字体 | 您的网络浏览器 | 数小时至一年 |
| 应用程序缓存 | 应用服务器内存 | 查询结果、会话 | 开发人员(Redis、Memcached) | 几秒到几小时 |
| 服务器/CDN缓存 | 全球边缘服务器 | 页面、媒体、API 回复 | 网站所有者和CDN | 每个缓存控制 TTL |
| DNS缓存 | 操作系统、路由器、解析器 | 域名到 IP 地址的查找 | DNS解析器 | 5分钟至24小时 |
是否应该清除缓存数据?何时清除?
人们常常把清除缓存当作维护清单上的一项繁琐工作。其实不必把它列入清单。它本质上只是一个故障排除工具,仅此而已。大多数情况下,缓存数据无需移除,因为它默默地加快了你之后访问的每个网站的加载速度。
那么,什么时候清除缓存才值得呢?说实话,只有三种情况。网站更新后无法访问或仍然显示过时的缓存版本,而浏览器缓存中的旧版本几乎总是罪魁祸首;清除缓存会强制重新下载。你曾在共享或公共电脑上浏览过内容,希望清除本地的浏览痕迹。或者你的手机内存只剩最后一个GB,需要释放空间,因为浏览器缓存很容易悄无声息地膨胀到几个GB。除此之外,清除缓存没有任何好处。它会减慢你下次访问每个网站的速度,因为浏览器需要重建缓存副本,而且有些浏览器还会在此过程中将你登出。人们最常犯的错误是:清除缓存不会删除你的cookie或已保存的密码。它们存储在单独的存储空间中,不会因清除缓存而丢失,除非你特意勾选了相应的选项。
| 浏览器 | 在哪里清除缓存 |
|---|---|
| 铬合金 | 设置、隐私和安全、删除浏览数据、缓存的图片和文件 |
| 火狐浏览器 | 设置、隐私和安全、Cookie 和网站数据、清除数据 |
| 狩猎之旅 | 设置、Safari 浏览器、清除历史记录和网站数据 |
| 边缘 | 设置、隐私、选择要清除的内容 |
缓存、Cookie 和缓冲区:消除混淆
三个词,经常被混淆,但都与数据存储有关。它们各自承担不同的功能。缓存保存内容副本,以便下次访问时速度更快。Cookie 是网站留下的一个小小的记录,用来记住你的信息:登录会话、语言设置、已保存的偏好设置等等。它承载的是身份信息,而不是内容。缓冲区又有所不同。它保存的是传输中的数据,例如视频流在你观看之前加载的几秒钟。最简单的区分方法是:缓存数据会保留以供重复使用,Cookie 会记住你的身份,而缓冲区会在使用后立即清空。
关于缓存和缓存机制,你需要记住什么
一旦你把缓存仅仅理解为“在需要的地方附近保留一份慢速文件的副本”,它就不再像是一项硬件功能,而更像是一种贯穿整个计算过程的习惯,从CPU上0.7纳秒的快速加载到存储在你城市附近边缘服务器上的网页副本,无一例外。网络尚未吸取的实用教训是:大部分速度提升都是免费的,但大多数网站仍然忽略了它。下次当你眨眼间网页瞬间打开时,你就会知道是哪个副本帮你节省了这趟“旅程”。