缓存未命中和缓存命中:何时发生(以及如何提高缓存命中率)

已发表: 2022-05-04

在没有可靠缓存策略的情况下优化网站性能就像在流沙上盖房子一样。

你可以使用最好的材料和工具,但是当你的基础不是坚如磐石时,你总会觉得有什么阻碍了你的进步。

您的缓存策略是您网站卓越网络性能的支柱。 如果你有一个适当的缓存系统,你可以大大提高你网站的速度。

相反,如果没有良好的缓存设置,访问者的请求将导致缓存未命中,进而会减慢页面加载时间。

缓存未命中只是以下几行将涵盖的主题之一:

  • 缓存简介;
  • 什么是缓存未命中?
  • 什么是缓存命中?
  • 什么是缓存命中率以及如何计算它?
  • 什么是好的缓存命中率?
  • 如何提高缓存命中率?
  • NitroPack - 实现出色缓存命中率的最简单方法。

让我们开始!

缓存简介

在深入研究缓存命中和未命中的世界之前,必须了解缓存的工作原理、它的用途以及为什么它被认为是最佳速度优化策略。

要了解缓存,我们需要退后一步,并遵循当访问者请求您的站点时在幕后参与的整个过程。

您的网站由 HTML 文档、JavaScript 和 CSS 文件、图像等组成。它们都存储在您的源服务器上。 当有人想访问您的网站时,他们的浏览器会向您的源服务器发送一个请求,然后源服务器会返回一个包含所有必要文件的响应。

网络如何运作

当您有 10 个访问者同时请求您网站的文件时,应该没有问题,并且您的服务器可以很容易地处理它们。

但是,当有 100,000 名访问者想要访问您的网站时,此模型不起作用。

服务器对它们可以同时处理的请求数量有限制,超过该限制的每个请求都会进入队列,从而导致访问者的加载时间更长。

队列

这就是缓存的用武之地。

简而言之,缓存是将站点数据(HTML、CSS、JS、图像等)的副本保存到称为 Web 缓存的不同位置的过程。

Web 缓存充当用户和您的源之间的中介角色。 这样,他们的请求是从缓存中提供的,而不是从您的服务器中检索的。

缓存

结果,您的页面加载速度更快。

您可以找到多种类型的缓存分类。 但是为了本文的目的,以及了解何时发生缓存命中和未命中,我们将了解两种最流行的类型——浏览器缓存和代理缓存。


浏览器缓存

每个浏览器都有自己的缓存策略,它可以将数据本地存储在用户的计算机上。

这很有用,因为它可以快速加载以前访问过的页面。 事实上,浏览器缓存是后退和前进按钮能够发挥作用的主要原因。

浏览器缓存

不幸的是,浏览器缓存仅限于在每个设备上运行。 但它最大的优点是可以保存整个网络的请求,这让它成为了必备。


代理服务器缓存

代理缓存有助于减轻服务器上的负载并向最终用户提供相对更快的内容。 最好的情况是代理缓存与浏览器缓存协同工作。

代理服务器分布在世界各地。 它们通常由 CDN(内容交付网络)提供商维护。

代理是用户和您的原始服务器之间的中介。 您可以使用它们将内容缓存在不同的位置,这样,您的内容将更接近用户,从而减少延迟和网络流量:

使用 CDN

与浏览器缓存不同,代理服务器缓存不受每个设备的限制,它可以同时向多个用户提供内容。

这就是缓存的要点。 这是一个细致入微的话题,还有更多内容有待展开——不同缓存类型的优缺点、如何设置缓存规则等等。

但这不是本文的重点。

如果您想深入了解该主题,可以查看我们的文章 - Web Caching 101: Beginner's Guide To HTTP Caching (Examples, Tips and Strategies)

或观看我们的 YouTube 视频:

现在,重要的是要记住,如果在您的网络缓存中找不到请求的数据,那就是延迟和问题开始发生的时候。 这给我们带来了缓存未命中。


什么是缓存未命中?

当系统、应用程序或浏览器请求从缓存中检索数据,但当前无法在缓存内存中找到该特定数据时,就会发生缓存未命中。

当发生缓存未命中时,请求将被转发到源服务器。

一旦从源中检索到数据,然后将其复制并存储到高速缓存中,以预期将来对相同数据的类似请求。

发生缓存未命中的原因有多种。

例如,特定数据从一开始就没有被缓存。

假设您有一个电子商务网站,并且您刚刚添加了一个新产品页面。 所有图像、HTML、CSS 和 JavaScript 文件从未被添加到缓存中,因为没有人请求它们。 这意味着您的第一位访问者必须向您的来源发送请求才能加载页面。 在第一次请求之后,数据将被传输到缓存并从中提供服务。

缓存未命中的另一种可能性是缓存数据在某个时候被删除。

同样,有几件事可能会导致这种情况 - 需要更多空间,应用程序请求删除,或者数据的生存时间策略已过期。

我们将在本文后面更多地讨论生存时间。

不管是什么原因,事实是每次缓存未命中都会导致更长的延迟、缓慢的加载时间、糟糕的用户体验和不满意的访问者。

但是,我不想给您留下需要在 100% 的时间内实现缓存命中的印象。 那是不现实的。

此外,在某些情况下,缓存未命中是必要的,因为您可能需要确保所提供的内容始终是最新的。

例如,像 bbc.com 这样的新闻网站可以在一天中多次更改其主页内容,因为需要报道突发新闻。 在这种情况下,缓存命中意味着他们的读者没有看到他们网站的最新版本,并且分别 - 他们错过了最新消息。

因此,缓存未命中的发生是有好处的。

但是,如果您没有新闻网站并且不定期更改您的内容,那么您应该致力于尽可能降低缓存未命中率和尽可能高的缓存命中率。


什么是缓存命中?

当请求的数据从缓存中成功提供时,就会发生缓存命中。

例如,如果用户访问您的某个产品页面,该页面应该显示您销售的产品的图像,他们的浏览器会将对该图像的请求发送到缓存(浏览器或 CDN)。 如果 CDN 在其存储中具有图像的副本,则请求会导致缓存命中,并且图像会被发送回浏览器。


什么是缓存命中率以及如何计算它?

缓存命中率衡量一个缓存从其存储中成功传递的请求数,与它总共接收到的请求数相比较。

高缓存命中率意味着您的大部分用户请求已由缓存完成,这反过来意味着他们的加载时间更快。

您可以使用以下公式计算缓存命中率:

缓存命中率公式

但是,这可能不是必需的,因为大多数 CDN 提供商都会为您计算这一点。

NitroPack 的仪表板也显示此信息:

NitroPack CHR


什么是好的缓存命中率?

作为一般经验法则 - 80% 或更高的缓存命中率是一个很好的结果,因为这意味着大多数请求都是从缓存中提供的。

静态网站上低于 80% 的任何值都表明缓存策略效率低下。

根据全球最大的 CDN 提供商之一 Cloudflare 的说法:

“一个主要由静态内容组成的典型网站很容易拥有 95-99% 范围内的缓存命中率。”

NitroPack 的全局缓存命中率为 90%。 大约 70% 的 NitroPack 用户体验到 80% 或更高的缓存命中率。


如何提高缓存命中率?

您可以采取特定步骤来减少缓存未命中的数量,从而提高缓存命中率。

1.根据您网站的需要设置缓存规则

缓存控制标头允许您设置无数不同的缓存规则,以优化您的内容服务。

一些规则包括:

  • no-store告诉网络缓存在任何情况下都不要存储任何版本的资源;
  • no-cache告诉 Web 缓存它必须在将缓存内容提供给用户之前通过源服务器验证缓存内容;
  • max-age设置缓存在重新下载或使用源服务器重新验证之前可以保留保存的资源的最长时间(以秒为单位)。 之后,内容被标记为过时;
  • s-maxage与 max-age 完全相同,但仅适用于代理缓存;
  • private告诉网络缓存只有私有缓存可以存储响应;
  • public将响应标记为公开。 任何中间缓存都可以存储标有该指令的响应;

缓存控制头

您应该设置一个最适合您的内容的生存时间(缓存在从源检索更新信息之前将保留您的数据的时间)。

例如,如果资产大约每两个月更改一次,则 50 天的max-age标头可能是合适的。 但是,如果资产每天都在更改,您可能希望使用无缓存标头。

您可以在我们的 YouTube 视频中找到有关缓存控制标头、缓存新鲜度和验证的更多信息:

2.忽略UTM参数

运行多个广告活动(例如,Facebook 广告、Google 广告等)会生成具有特定 UTM 参数的不同 URL。

因此,您有一个页面需要优化多个变体(不同的 UTM 参数)。

UTM 标签

这是一个问题,因为每个 URL 变体都被认为是一个唯一的对象,并且每个请求都将被定向到源服务器。

因此,即使请求的内容在 Web 缓存中可用,每个请求都将被归类为缓存未命中。

这会导致缓存命中率不必要地降低。


NitroPack - 实现出色缓存命中率的最简单方法

在我们介绍完所有内容之后,实现高缓存命中率的整个过程可能听起来有点不知所措。

好消息是,如果您与 CDN 提供商合作,我提到的大部分内容(例如缓存控制标头)可能已经为您处理好了。

对于其他一切,您可以使用缓存插件。

例如,NitroPack 具有开箱即用的功能,可确保我们用户的高缓存命中率。 这包括:

  • 缓存预热将模拟对您网站的自然访问,这会自动导致 NitroPack 为桌面和移动设备准备优化(缓存)版本的网站。
  • 缓存失效将缓存的内容标记为“陈旧”,但会一直提供服务,直到有新优化的内容可用。 因此,您的访问者总是会看到优化的内容,即使它可能会在短时间内过时。
  • 内置 CDN,无需您将 CDN 与您选择的缓存插件同步。 这通常很耗时、不方便,并且可能会导致意想不到的问题。
  • 忽略参数选项,允许 NitroPack 默认忽略一些常用的 UTM(和其他)参数,这样您在运行营销活动时无需担心。

忽略参数

但你不必相信我的话。 免费测试 NitroPack,亲眼看看它的影响。