本文主要关注 Amazon CloudFront CDN 缓存以及如何使用它们来实现更好的缓存命中率。
在了解缓存中的命中率和未命中率之前,最好先了解缓存是什么。
什么是缓存?
例如,缓存是一种高速存储器,可临时保存网页中的数据或内容,以便下次访问该页面时,该内容显示得更快。它有助于更快地加载网页以获得更好的用户体验。对于数据库和其他存储,也是使用类似的方式。
在 AWS Cloud 中,缓存分为:
- 内容交付网络 (CDN) 缓存 - CDN 是几乎所有 Web 应用程序的关键组件。过去,CDN 仅通过在全球分布的一组缓存服务器上复制常用请求的文件(静态内容)来改进内容的交付。
- Web 缓存 - Web 缓存是通过在缓存中保留 HTTP 响应和 Web 资源来执行的,以完成来自缓存而不是来自原始服务器的未来请求。
- 数据库缓存 - 内存数据缓存是提高整体应用程序性能和降低数据库成本的最有效策略之一。缓存可以应用于任何类型的数据库,包括关系数据库,例如 Amazon RDS 或 NoSQL 数据库。
- 更多… - AWS缓存解决方案_亚马逊云缓存服务-AWS云服务(https://aws.amazon.com/cn/caching/aws-caching/)
这些缓存通常由以下 AWS 服务提供:Amazon ElastiCache、Amazon DynamoDB Accelerator (DAX)、Amazon CloudFront CDN 和 AWS Greengrass。
什么是缓存命中率?
缓存命中率是适用于任何缓存的重要指标,不局限于 CDN。缓存命中率描述了从缓存而不是从原始存储(源服务器)成功提供内容的情况。
这是 CDN 的一项重要指标,但不是唯一需要监控的指标;对于内容变化频繁的动态网站,缓存命中率会比静态网站略低。但是,现代 CDN(例如 Amazon CloudFront)也可以执行动态缓存。很多 CDN 服务提供商应在其性能报告中都会提供其缓存命中分数。
什么是缓存未命中率?
它通常以百分比表示,例如 5% 的缓存未命中率。高速缓存未命中率通常是指搜索高速缓存时,未找到数据。发生这种情况时,应将请求转发到原始存储/服务器,并将内容传输给用户,并在可能的情况下写入缓存。
缓存命中和未命中示例
缓存命中示例
用户打开您网站的主页,例如,图片的副本(静态内容)从用户附近的缓存服务器加载,因为以前的用户已经使用过相同的内容。这就是缓存命中率需要时间积累的原因。开始时,缓存命中百分比将为 0%。然后随着缓存服务器创建数据副本,它会慢慢开始增加。但是对于很多缓存服务器,这可能需要一段时间。
缓存未命中示例
用户在电子商务网站上打开产品页面,如果产品图片的副本当前不在 CDN 缓存中,则此请求会导致缓存未命中,并将请求传递到原始图片的源服务器。CDN 服务器将在源服务器响应后缓存照片,因此对它的任何其他额外请求都将导致缓存命中。
对于大多数网站来说,好的 CDN 缓存命中率是多少?
一般来说,对于大多数网站来说,95-99% 的命中率和 1-5%的未命中率是最理想的。您应该记住,这些数字是特定于用例的,对于动态内容或可能经常更改的特定文件,可能会有很大不同。您应该了解 CDN 使用后的不同的优点,例如安全性和成本优化。
如何计算缓存命中率
计算缓存命中率的最佳方法是将缓存命中总数除以缓存命中总数和缓存未命中数之和。
该值通常以请求或命中适用缓存的百分比表示。
缓存命中率公式和示例如下。
例如,如果您有 43 个缓存命中(请求)和 11 个未命中,那么这意味着您将 43(缓存命中总数)除以 54(11 个缓存未命中和 43 个缓存命中的总和)。结果将是 0.796 的缓存命中率。并将其表示为百分比,将最终结果乘以 100。
这给出了 79.6% 的缓存命中率。
如何衡量 CDN 缓存命中率?
您应该能够在 CDN 的统计信息中找到缓存命中率。如果您无法找到准确的缓存命中率,您可以尝试使用上一节中的公式进行计算。
对于 Amazon CloudFront CDN,您可以通过两种可能的方式在 AWS 管理控制台中获取此信息:
- 通过在控制台中使用Amazon CloudFront 缓存统计信息(https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cache-statistics.html)
- Amazon CloudWatch 中的实时指标
缓存命中和未命中问题
缓存适用于各种用例,但在为每个内容使用 CDN 缓存之前,有几个可能的问题需要回答:
1、数据结构是否适合缓存?
简单地缓存数据库记录通常足以提供显着的性能优势。但是,通常时候,最好以组合多条记录的格式缓存数据。因为缓存是简单的键值存储,您可能还需要缓存多种不同格式的数据记录,以便您可以通过记录中的不同属性访问它。
2、缓存对每个数据都有效吗?
某些应用程序会生成不适合缓存的访问模式——例如,扫描频繁更改的大型数据集。在这种情况下,使缓存保持最新可能会抵消缓存可能提供的任何优势。
3、使用缓存的内容(值、对象)总是安全的吗?
同一条数据在不同的上下文中可能有不同的一致性要求。例如,在线结账时,您需要产品的权威价格,因此缓存可能不合适。但是,在产品页面上,价格可能会过时几分钟,而不会对用户产生负面影响。
高缓存命中率是否总是意味着 CDN 有效?
缓存命中率是 CDN 的一个重要指标,但其他指标对 CDN 的有效性也很重要,例如RTT(往返时间)或其他因素,例如缓存内容的存储位置。理想情况下,CDN 服务应将内容缓存到尽可能靠近最终用户和尽可能多的用户的位置。
如何提高 CDN 的缓存命中率
通常,您可以使用以下建议来提高 CDN 缓存命中率:
1、优化缓存控制头
Cache-Control 头域指定了请求和响应情况下的缓存机制的指令。这些标头用于设置属性,例如对象的最长期限、到期时间 (TTL) 或对象是否完全缓存。根据内容更改的频率,您需要指定此属性。优化这些属性值可以帮助增加 CDN 上的缓存命中数。
示例: 设置最适合您的内容的生存时间 (TTL)。例如,如果资产大约每两周更改一次,则 7 天的缓存时间可能是合适的。但是,如果频繁访问资产,您可能希望使用一天或更短的生命周期。
2、忽略cookies
Cookie 往往是不可缓存的,因此包含它们的文件也是不可缓存的。因此,制定规则很重要。例如,忽略您希望通过 CDN 交付的资产请求中的所有 cookie 。
3、忽略查询字符串
查询字符串有多种用途:它们有助于与 Web 应用程序和 API 交互、聚合用户指标并为对象提供信息。当查询字符串包含在静态对象 URL 中时,就会出现问题。在这种情况下,CDN 会将它们误认为是唯一对象,并将请求定向到源服务器。因此,即使请求的内容在 CDN 缓存中可用,每个请求都将被归类为缓存未命中。这会导致缓存命中率不必要地降低。
其他
如果您使用的是 Amazon CloudFront CDN,您可以遵循这些 AWS 建议 (https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cache-hit-ratio.html) 以获得更高的缓存命中率。本文主要介绍了如何设置和管理对象缓存以提高性能并满足您的业务需求。
- 指定 CloudFront 缓存对象的时间
- 使用 CloudFront Origin Shield
- 基于查询字符串参数的缓存
- 基于 cookie 值的缓存
- 基于请求头的缓存
- 不需要压缩时删除 Accept-Encoding 标头
- 使用 HTTP 提供媒体内容