网络缓存基础知识:术语、HTTP 标头和缓存策略

介绍

智能内容缓存是改善网站访客体验的最有效方法之一. 缓存或暂时存储先前请求的内容是 HTTP 协议内实施的核心内容交付策略的一部分。

在本指南中,我们将讨论网页内容缓存的一些基本概念,这将主要涵盖如何选择缓存策略,以确保整个互联网的缓存可以正确处理您的内容,我们将讨论缓存提供的优点,需要注意的副作用,以及使用的不同策略,以提供最佳的性能和灵活性的组合。

什么是Caching?

缓存是存储可重复使用的响应的术语,以便使后续请求更快。有许多不同的缓存类型可用,每种都有自己的特点。

网络缓存,本指南的重点,是另一种类型的缓存. 网络缓存是HTTP协议的核心设计功能,旨在最大限度地减少网络流量,同时提高整个系统的感知响应能力。

Web 缓存通过根据某些规则缓存 HTTP 响应请求,然后可以从更接近用户的缓存中完成缓存内容的后续请求,而不是将请求全部发送回 Web 服务器。

福利

有效的缓存有助于内容消费者和内容提供商,缓存为内容交付带来的一些好处是:

  • 网络成本降低:内容可以在内容消费者和内容来源之间的网络路径的不同点内缓存。当内容缓存更接近消费者时,请求不会导致网络活动超出缓存
  • 增强响应性:缓存使内容可以更快地检索,因为整个网络周游是不必要的。保持在用户附近的缓存,如浏览器缓存,可以使这种检索几乎立即
  • 在同一硬件上的性能提高:对于内容起源的服务器,可以通过允许侵略性缓存来从同一硬件中提取更多的性能。内容所有者可以利用沿着交付路径的强大的服务器来取代某些内容的负载 网络中断时的内容可用性:

术语

在处理缓存时,你可能会遇到一些可能不熟悉的术语,下面有一些更常见的术语:

  • 奥里金服务器: 源服务器是内容的原始位置. 如果您担任网络服务器管理员, 这是您控制的机器 。 它负责服务任何无法从请求路线的缓存中取出的内容,并为所有内容设置缓存策略. (_ ( )* ** 切换率**: 缓存的效能以其缓存命中率或命中率来衡量. 这是可从缓存中检索到的请求与请求总数的比例。 高缓存命中率意味着从缓存中可以取出高百分比的内容. 这通常是大多数管理员期望的结果。 () ( )* Freshness:Freshness是一个术语,用来描述缓存内某个物品是否仍然被认为是为客户服务的候选人. 缓存中的内容只有在缓存策略指定的新鲜度时间范围内才会用于响应. () ( )* ** Stale 内容 :缓存中的项目根据缓存策略中的缓存新鲜度设置而过期. 过期内容为"sale". 一般来说,过期的内容不能用来回应客户请求. 源服务器必须重新接触以获取新内容,或至少确认缓存内容仍然准确. (_ ( ) ** Validation :可验证缓存中的 Stale 项,以刷新其过期时间。 校验涉及到源服务器查看缓存内容是否仍然代表项目的最新版本. (_) ( ) ** 无效:无效化是指在缓存指定到期日之前删除内容的过程. 如果原端服务器上的项目被更改,且缓存中有一个过时的项目会对客户端造成重大问题,则这样做是必要的. (单位:千美元) (英语)

还有很多其他缓存术语,但上面的术语应该帮助你开始。

什么可以隐藏?

某些内容比其他内容更容易缓存,对于大多数网站来说,一些非常缓存友好的内容是:

  • 徽标和品牌图像
  • 一般不旋转图像(例如导航图标)
  • 风格表
  • 一般的 JavaScript 文件
  • 可下载的内容
  • 媒体文件

这些往往不经常改变,所以他们可以从更长的时间内缓存中受益。

一些你在缓存时需要小心的事情是:

  • HTML 页面
  • 旋转图像
  • 经常修改的 JavaScript 和 CSS
  • 使用身份验证 Cookie 请求的内容

一些几乎永远不应该缓存的项目是:

  • 与敏感数据相关的资产(银行信息等)
  • 用户特定和频繁更改的内容

除了上述一般规则外,还可以指定允许您适当地缓存不同类型的内容的策略。例如,如果已验证的用户都看到同一个网站视图,则可能可以在任何地方缓存该视图。

网站内容被隐藏的地方

内容可以在整个供应链中的许多不同点进行缓存:

  • 浏览器缓存:网页浏览器本身保持小缓存。 通常,浏览器会设置一个策略,命令最重要的内容缓存。 这可能是用户特定的内容或内容,被认为是昂贵的下载,并且可能会再次被要求
  • 中间缓存代理:客户端和您的基础设施之间的任何服务器都可以随意缓存某些内容。 这些缓存可能由ISP或其他独立方维护
  • 反缓存:您的服务器基础设施可以为后端服务实施自己的缓存。

这些位置中的每一个都可以并且通常会根据自己的缓存策略和内容来源设置的策略来缓存项目。

秘密头部

缓存策略取决于两个不同的因素. 缓存实体本身可以决定是否缓存可接受的内容。

大多数缓存行为由缓存策略决定,该策略由内容所有者设置,这些策略主要通过使用特定的 HTTP 标题来表达。

通过HTTP协议的各种迭代,出现了几种不同的缓存重点标题,具有不同程度的复杂性。

  • Expers:`Expers ' 标题非常直线,虽然范围相当有限。 基本上,它设定了将来内容会过期的时间. 此时,对相同内容的任何请求都必须返回源服务器. 此页眉可能仅作为后退使用 。
  • QQ 缓存控制 **: 这是 " Expires " 标题的更现代的替代。 它得到了很好的支持,并实施了更加灵活的设计。 几乎在所有情况下,这都比延长 ' 更为可取,但确定这两个值可能不会受到伤害。 我们稍后将讨论您与缓存控制设定的选项的具体内容。 (_) ( )* Etag:Etag标题用于缓存验证。 当物品最初服务于内容时,来源可为物品提供一个独特的 " Etag " 。 当缓存在到期时需要验证它手头的内容时,它可以发送它拥有的用于内容的"Etag". 来源要么告诉缓存内容相同,要么发送更新的内容(带有新的"Etag").
  • 最后修改 **: 此页眉指定上次修改项目的时间 。 这可以用作验证战略的一部分,以确保新鲜内容。 (_) ( )* Content-Length ' :`Content-Length ' 标题虽然没有具体涉及缓存,但在界定缓存政策时,必须设置。 某些软件如果在高级时不知道需要为.
  • 预留空间的内容大小,将拒绝缓存内容. XQVaryQQ:缓存通常使用请求的主机和资源路径作为存储缓存项目的密钥. " Vary " 头可以用来告诉缓存在决定请求是否为同一项目时注意另一个头. 这最常用的是用 接受- Encoding 头来告诉缓存键, 这样缓存就会知道区分压缩内容和未压缩内容。 (_) (英语)

更多关于 Vary Header 的信息

Vary标题为您提供了存储相同内容的不同版本的能力,而不是稀释缓存中的条目。

接受编码的情况下,设置Vary标题允许在压缩和未压缩的内容之间进行关键的区分,这需要正确地为无法处理压缩内容的浏览器提供这些项目,并且是为了提供基本的可用性所必需的。

用户代理这样的项目在第一眼看起来似乎是一个很好的方式来区分移动和桌面浏览器来服务您的网站的不同版本。然而,由于用户代理字符串是非标准的,结果可能会是中间缓存上相同的内容的许多版本,缓存的打击率非常低。

缓存控制旗帜如何影响缓存

上面,我们提到了如何使用Cache-Control标题用于现代缓存策略规格。 可以使用此标题设置多种不同的策略指令,并且可以将多个指令分隔成条纹。

您可以使用的一些缓存控制选项来命令您的内容的缓存策略是:

*#####没有卡切###: 该指令规定,任何缓存内容必须在每次请求上重新验证后才能送达客户端. 这实际上标志着内容立即被打碎了,但允许它使用再验证技术来避免整个项目再次被重新下载.

  • 不,不,不,不,不,不。 此指示表明内容不能以任何方式被缓存. 如果响应代表敏感数据,此设置是适当的。
  • 公众: 这标志着内容是公开的,这意味着它可以被浏览器和任何中间缓存所缓存. 对于使用HTTP认证的请求,答复默认为私人标识。 此头覆盖了设置 。
  • 校对:Soup 私人内容可能由用户的浏览器存储,但必须_not_被任何中间方缓存. 这经常用于用户特定数据.
  • 年龄: 此设置将配置内容在必须重新验证或重新从源服务器上下载内容之前可能缓存的最大年龄 。 从本质上讲,这取代了现代浏览的`Expires'标题,是确定某一部分内容新鲜度的基础。 此选项按秒计值, 最大有效新鲜时间为一年( 31536000 秒) 。 ( _ ( )* : (笑声) 这与 " 最大年龄 " 设置非常相类似,因为它表明内容可被缓存的时间。 不同的是,这个选项仅适用于中间缓存. 将这一点与上述内容结合起来,可以进行更灵活的政策构建。
  • QQMust- revalidate {}: 这表明 " 最大年龄 " 、 " 最大年龄 " 或 " 最长年龄 " 标题所显示的新鲜信息必须严格遵守。 任何情况下都无法提供Stale内容。 这样可以防止在网络中断和类似情况中使用缓存内容。 (_) ) * ++xy- revalidate *=需要含有url= (帮助) (中文(简体) ). 这与上述设置相同,但只适用于中间代理. 在这种情况下,用户的浏览器有可能在网络中断时用于服务已过时的内容,但中间缓存不能用于此目的.
  • QQno- transform `**: 这个选项告诉缓存,他们在任何情况下都不允许因性能原因修改收到的内容. 例如,这意味着缓存无法发送它没有从源服务器被压缩而不允许接收的内容的压缩版本. (单位:千美元) (英语)

这些可以以不同的方式相结合,以实现各种缓存行为. 一些相互排斥的价值观是:

  • no-cache, no-store,以及正常的缓存行为,表示没有
  • 公共私人

没有商店选项取代了没有缓存选项,如果两者都存在,对未经身份验证的请求的响应来说,公共是暗示的,对已身份验证的请求的响应来说,私人是暗示的。

制定一个缓存策略

在一个完美的世界里,一切都可以被攻击性地缓存,你的服务器只会偶尔被联系来验证内容,但在实践中这并不经常发生,所以你应该尝试设置一些健全的缓存策略,旨在平衡实施长期缓存和响应不断变化的网站的需求。

共同问题

有许多情况下,由于内容的生成方式(每位用户动态生成)或内容的性质(例如敏感的银行信息)无法或不应该实现缓存。

这些都是常见的问题,可能会对缓存性能和您提供的内容的准确性产生严重影响,但是,我们可以通过制定预测这些问题的缓存策略来缓解这些问题。

一般建议

虽然你的情况会决定你使用的缓存策略,但以下建议可以帮助你做出一些合理的决定。

您可以采取某些步骤来增加您的缓存打击比,然后再担心您使用的特定标题。

  • ** 设置图像、css和共享内容的具体目录**: 将内容放入专用目录将允许您从网站的任意一页轻松引用它们 。 () ( )* ** 使用相同的URL指代相同的项目**: 由于缓存键从主机和所请求的内容的路径中切出,所以确保您在所有页面中以同样的方式引用您的内容. 以前的建议使这一点变得容易得多。 () ( )* ** 尽可能使用 CSS 图像图示** : 图标和导航等项目的 CSS 图像图案会减少使您的站点变形所需的往返次数, 并允许您的站点长期缓存该单一图案 。 () ( )* ** 尽可能在当地提供主文和外部资源**: 如果您使用 Javascript 脚本和其他外部资源, 如果上游没有提供正确的信头, 请考虑将这些资源托管在您的服务器上 。 请注意, 您必须知道对上游资源所做的任何更新, 以便您可以更新本地副本 。 () ( )* ** 指纹缓存项目**: 对于CSS和Javascript文件等静态内容,可能适合给每个项目打指纹. 这意味着在文件名上添加一个独特的标识符(通常是文件的散列),这样如果资源被修改,可以请求新的资源名,导致请求正确绕过缓存. 有多种工具可以帮助在HTML文档中创建指纹并修改引用. (单位:千美元) (英语)

在选择不同的项目的正确标题方面,以下可以作为一般参考:

  • ** 允许所有缓存存储通用资产**: 不针对用户的静态内容和内容可以而且应该在交付链的所有环节被缓存. 这将允许中介缓存以内容响应多个用户. () ( )* ** Allow 浏览器以缓存用户特定资产**: 对于每个用户的内容来说,允许在用户浏览器内进行缓存往往可以接受并有用. 虽然此内容不适合在任何中间缓存代理上缓存,但浏览器中的缓存将允许用户在随后的访问中进行即时检索. () ( )* ** 对关键时间敏感内容作例外规定**: 如果内容具有时间敏感性,请对上述规则做出例外规定,以免过时的内容在危急情况下被送达. 例如,如果您的网站有一个购物车,它应该立即反映在购物车中的物品. 根据内容的性质,可以在控制目录标题中设置不保存不储存选项,以实现这一目标。 (_) ( )* ** 始终提供验证器**: 校验器允许刷新已过时的内容而无需再下载整个资源. 设置 Etag Last- Medized 信头, 允许缓存验证其内容, 如果在源头没有修改, 则重新保存, 从而进一步减少负载 。
  • ** 选择支持内容的长新时间**: 为了有效地利用缓存,请求作为支持内容的元素满足请求时,往往应当有一个很长的新鲜度设定. 这通常适用于像图像和CSS这样的项目,它们被拉入,以制作用户所要求的HTML页面. 设置延长的新鲜时间,加上指纹,可以让缓存长期存储这些资源. 如果资产发生变化,被修改的指纹会使被缓存的项目失效并触发新内容的下载. 在此之前,辅助项目可以被缓存到远未来去. (_ ( )* ** 为父内容设定简短的新鲜时间**: 为了使上述办法发挥作用,所装物品的新鲜度必须相对较短,或者可能根本不被缓存. 这通常是HTML页面调用其他辅助内容. HTML本身会被频繁地下载,使其能对变化做出迅速的反应. 然后,支持内容可以积极地被缓存。 (_) (英语)

关键是达到平衡,在可能的情况下有利于侵略性缓存,同时留下机会在进行更改时在未来取消条目。

  • 攻击性缓存项目
  • 缓存项目具有短的新鲜时间和重新验证能力
  • 根本不应该缓存项目

目标是尽可能将内容迁移到第一类,同时保持可接受的准确度。

结论

花时间确保您的网站有适当的缓存策略可以对您的网站产生重大影响。缓存允许您减少与重复提供相同内容相关的带宽成本。您的服务器也将能够处理与相同硬件的大量流量。也许最重要的是,客户将在您的网站上获得更快的体验,这可能会导致他们更频繁地返回。

Published At
Categories with 技术
comments powered by Disqus