

# 增加直接从 CloudFront 缓存提供服务的请求的比例（缓存命中率）
<a name="cache-hit-ratio"></a>

您可以通过增加直接从 CloudFront 缓存提供服务的查看器请求的比例（而不是转至源服务器以获得内容）来提高性能。这称为提高缓存命中率。

以下部分说明了如何提高缓存命中率。

**Topics**
+ [指定 CloudFront 缓存对象的时间长度](#cache-hit-ratio-duration)
+ [使用源护盾](#cache-hit-ratio-use-origin-shield)
+ [根据查询字符串参数进行缓存](#cache-hit-ratio-query-string-parameters)
+ [根据 Cookie 值进行缓存](#cache-hit-ratio-cookies)
+ [根据请求标头进行缓存](#cache-hit-ratio-request-headers)
+ [不需要压缩时删除 `Accept-Encoding` 标头](#cache-hit-ratio-remove-accept-encoding)
+ [通过 HTTP 提供媒体内容](#cache-hit-ratio-http-streaming)

## 指定 CloudFront 缓存对象的时间长度
<a name="cache-hit-ratio-duration"></a>

要提升缓存命中率，您可以配置源来将 [Cache-Control max-age](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) 指令添加到您的对象，并为 `max-age` 指定在实践中可行的最长值。缓存持续时间越短，CloudFront 将请求发送到源（用以确定对象是否已更改，并获取最新版本）的次数就越多。您可以用 `stale-while-revalidate` 和 `stale-if-error` 指令来补充 `max-age`，以进一步提高某些条件下的缓存命中率。有关更多信息，请参阅 [管理内容保留在缓存中的时间长度（过期）](Expiration.md)。

## 使用源护盾
<a name="cache-hit-ratio-use-origin-shield"></a>

Origin Shield 可以帮助提高 CloudFront 分配的缓存命中率，因为它在源之前提供了额外的缓存层。当您使用 Origin Shield 时，从所有 CloudFront 缓存层到您的源的所有请求都来自一个位置。CloudFront 可以使用来自 Origin Shield 的单个源请求检索每个对象，CloudFront 缓存的所有其他层（边缘站点和[区域边缘缓存](HowCloudFrontWorks.md#CloudFrontRegionaledgecaches)）可以从 Origin Shield 中检索对象。

有关更多信息，请参阅 [使用 Amazon CloudFront Origin Shield](origin-shield.md)。

## 根据查询字符串参数进行缓存
<a name="cache-hit-ratio-query-string-parameters"></a>

如果您将 CloudFront 配置为基于查询字符串参数进行缓存，则可以通过以下方法来改进缓存：
+ 将 CloudFront 配置为仅转发您的源将返回唯一对象的那些查询字符串参数。
+ 为相同参数的所有实例使用相同的大小写。例如，如果一个请求包含 `parameter1=A`，另一个请求包含 `parameter1=a`，则 CloudFront 在一个请求包含 `parameter1=A` 而一个请求包含 `parameter1=a` 时，会将两个请求分别转发到源。然后，CloudFront 分别缓存源返回的对应对象，即使这些对象完全相同。如果您仅使用 `A` 或 `a`，CloudFront 会将较少的请求转发到源。
+ 按相同的顺序列出参数。与大小写不同的情况相似，如果对象的一个请求包含查询字符串 `parameter1=a&parameter2=b`，而相同对象的另一个请求包含 `parameter2=b&parameter1=a`，CloudFront 会将两个请求转发到源，并分别缓存对应的对象，即使它们完全相同。如果您始终为参数使用相同的顺序，CloudFront 会将较少的请求转发到源。

有关更多信息，请参阅 [根据查询字符串参数缓存内容](QueryStringParameters.md)。如果您希望查看 CloudFront 转发到源的查询字符串，请查看 CloudFront 日志文件的 `cs-uri-query` 列中的值。有关更多信息，请参阅 [访问日志（标准日志）](AccessLogs.md)。

## 根据 Cookie 值进行缓存
<a name="cache-hit-ratio-cookies"></a>

如果您将 CloudFront 配置为基于 Cookie 值进行缓存，则可以通过以下方法来改进缓存：
+ 将 CloudFront 配置为仅转发指定的 Cookie 而不是转发所有 Cookie。对于配置为由 CloudFront 转发到源的 Cookie，CloudFront 将转发每个 Cookie 名称和值组合。然后，它单独缓存由源返回的对象，即使这些对象全都相同。

  例如，假设查看器在每个请求中包含两个 Cookie，每个 Cookie 有三个可能的值，并且 Cookie 值的所有组合均可能。对于每个对象，CloudFront 最多会将九个不同的请求转发到您的来源。如果您的源仅基于其中一个 Cookie 返回不同的对象版本，则 CloudFront 会不必要地将更多请求转发到您的源，并且不必要地缓存对象的多个相同版本。
+ 为静态和动态内容创建单独的缓存行为，将 CloudFront 配置成仅为动态内容将 Cookie 转发到源。

  举例而言，假设您的分配只有一个缓存行为，而您希望将分配同时用于动态内容（例如 `.js` 文件）和很少更改的 `.css` 文件。CloudFront 根据 Cookie 值缓存 `.css` 文件的单独版本，这样每个 CloudFront 边缘站点会为每个新 Cookie 值或 Cookie 值的组合将请求转发到您的源。

  如果您创建一个缓存行为，其路径模式为 `*.css` 并且 CloudFront 不根据 Cookie 值进行缓存，则 CloudFront 仅在以下情况下将 `.css` 文件的请求转发到源：边缘站点收到给定 `.css` 文件的第一个请求以及 `.css` 文件过期后收到的第一个请求。
+ 如果可能，请在 Cookie 值对于每个用户唯一（例如用户 ID）时为动态内容创建单独的缓存行为，并为基于少量唯一值变化的动态内容创建单独的缓存行为。

有关更多信息，请参阅 [根据 Cookie 缓存内容](Cookies.md)。如果要查看 CloudFront 转发到源的 Cookie，请查看 CloudFront 日志文件的 `cs(Cookie)` 列中的值。有关更多信息，请参阅 [访问日志（标准日志）](AccessLogs.md)。

## 根据请求标头进行缓存
<a name="cache-hit-ratio-request-headers"></a>

如果您将 CloudFront 配置为基于请求标头进行缓存，则可以通过以下方法来改进缓存：
+ 将 CloudFront 配置为仅基于指定标头进行转发和缓存，而不是基于所有标头转发和缓存。对于您指定的标头，CloudFront 将转发每个标头名称和值组合。然后，它单独缓存由源返回的对象，即使这些对象全都相同。
**注意**  
CloudFront 始终将以下主题中指定的标头转发给您的源：  
CloudFront 如何处理请求并将请求转发到您的 Amazon S3 原始服务器 > [CloudFront 删除或更新的 HTTP 请求标头](RequestAndResponseBehaviorS3Origin.md#request-s3-removed-headers)
CloudFront 如何处理请求及如何将请求转发给您的自定义原始服务器 > [HTTP 请求标头和 CloudFront 行为（自定义源和 Amazon S3 源）](RequestAndResponseBehaviorCustomOrigin.md#request-custom-headers-behavior)

  当您将 CloudFront 配置为基于请求标头进行缓存时，无需更改 CloudFront 转发的标头，仅更改 CloudFront 是否基于标头值缓存对象。
+ 尝试避免基于具有大量唯一值的请求标头进行缓存。

  例如，如果您希望基于用户设备提供不同大小的图像，不要将 CloudFront 配置为基于 `User-Agent` 标头进行缓存，这会导致大量可能的值。而应该将 CloudFront 配置为基于 CloudFront device-type 标头 `CloudFront-Is-Desktop-Viewer`、`CloudFront-Is-Mobile-Viewer`、`CloudFront-Is-SmartTV-Viewer` 和 `CloudFront-Is-Tablet-Viewer` 进行缓存。此外，如果您为平板电脑和桌面返回相同版本的图像，则仅转发 `CloudFront-Is-Tablet-Viewer` 标头，而不是 `CloudFront-Is-Desktop-Viewer` 标头。

有关更多信息，请参阅 [根据请求标头缓存内容](header-caching.md)。

## 不需要压缩时删除 `Accept-Encoding` 标头
<a name="cache-hit-ratio-remove-accept-encoding"></a>

如果未启用压缩 – 由于源不支持它，CloudFront 不支持它，或者内容不可压缩 – 您可以通过将分配中的缓存行为与设置 Custom Origin Header 的源相关联来增加缓存命中率，如下所示：
+ **标头名称**：`Accept-Encoding`
+ **标头值**：（保留为空）

在使用此配置时，CloudFront 会从缓存键中删除 `Accept-Encoding` 标头，并且不在源请求中包含标头。此配置应用于 CloudFront 从该源通过分发所提供的所有内容。

## 通过 HTTP 提供媒体内容
<a name="cache-hit-ratio-http-streaming"></a>

有关优化点播视频 (VOD) 和流式传输视频内容的信息，请参阅[使用 CloudFront 的点播视频和实时流视频](on-demand-streaming-video.md)。