1. 微擎百科首页
  2. 开发学习

什么是缓存数据?清除缓存的含义是什么,它是做什么的?

本文原文是英文,使用电子翻译软件翻译的。已经做过一次调整。相关的术语有误。
本文中的“资源”,对应英文单词“resources”。文中的超链接均指向英文释义。

首先,什么是缓存?

一般而言,缓存(发音为“cash”)是一种存储库。您可以将存储库视为一个仓库。在军队中,这就相当于是执行任务所需的武器,食物和其他用品。

A-simplified-diagram-of-the-cold-chain-logistics-network

军事分销网络

在计算机科学中,这些“supplies”被称为资源,其中资源是脚本,代码和文档内容。后者有时被更具体地称为“assets”,例如文本,静态数据,媒体和超链接,但在这里我仅使用一个术语“资源”。(我习惯称之为“数据”,但是显然缓存不止是数据,所以此处沿用原文的:资源)

 

缓存和其他类型的存储库之间的区别

缓存的主要目的是加快对网页资源的检索,减少页面加载时间。缓存的另一个关键点是需要确保它包含相对较新的数据。

本文将介绍两种流行的缓存方法:浏览器缓存内容分发网络(CDN)。

除缓存外,其他存储库在Web体系结构中也起作用。通常,这些数据包旨在容纳大量数据。但是,它们并没有专注于检索性能。

例如,Amazon Glacier是一个数据存储库,旨在廉价地存储数据,但无法快速检索。另一方面,SQL数据库被设计为灵活,最新和快速的,但很少便宜,通常不如缓存快。

浏览器缓存:内存缓存

一个内存高速缓存存储资源在本地,浏览器正在运行的计算机上。当浏览器处于活动状态时,检索到的资源将存储在计算机的物理内存(RAM)上,也可能存储在硬盘驱动器上。

稍后,当重新访问网页时需要完全相同的资源时,浏览器将从高速缓存而不是远程服务器中提取资源。由于高速缓存存储在本地,因此在快速内存中,可以更快地获取这些资源,并且页面加载速度也更快。

Screenshot-2020-03-06-at-12.20.39-PM

资源检索的速度至关重要,但是资源必须最新的。过时的资源是已过期的资源,可能不再有效。

浏览器的一部分工作是识别哪些缓存资源过时,并重新获取那些缓存资源。由于网页通常具有可能的资源,因此缓存中通常会混合使用过时的版本和最新的版本。

浏览器如何知道缓存中的过期数据?

答案并不简单,但是有两种主要方法:缓存清除和HTTP标头字段。

清除缓存

缓存清除是一种服务器端技术,可确保浏览器仅获取新鲜资源。它间接地做到这一点。

尽管缓存清除听起来很引人注目,但它实际上并没有破坏任何内容,甚至不涉及浏览器中已经缓存的内容。清除缓存所做的所有事情都是以一种使原始资源的URI改变的方式,使浏览器看上去该资源是全新的。由于它看起来很新,因此不会位于浏览器的缓存中。旧版本的缓存资源仍将被缓存,但最终将枯萎而死,不再被访问。

假设我有一个网页,www.foobar.com/about.html其中包含您想了解的有关foobar.com的所有信息。访问该页面后,浏览器将缓存该页面及其相关资源。

后来,foobar.com被Quxbaz公司收购,并且about页面的内容发生了重大变化。浏览器的缓存不会包含该新内容,但仍可能会认为该内容是当前内容,并且永远不会尝试重新获取它。

Quxbaz网站管理员,您如何确保所有新内容被推出?

由于浏览器依靠URI在缓存中查找项目,因此,如果资源的URI发生更改,则好像浏览器从未见过它,然后才从服务器获取该资源。

因此,通过将资源URI从更改www.foobar.com/about.htmlwww.foobar.com/about2.html(或更改为www.quxbaz.com/about.html),浏览器将找不到与该URI关联的任何缓存资源,并从服务器进行完全提取。该资源可能与旧URI下的原始资源基本相同,但是浏览器并不知道。

不过,您不必更改页面名称。由于URI还包括根据定义的查询字符串,你可以添加一个版本参数为URI: www.foobar.com/about.html?v=2hef9eb1

在这种情况下,只要内容发生更改或由其他过程(例如服务器重新启动)触发,就会将版本参数v设置为新的新生成的哈希值。浏览器发现查询字符串已更改,并且由于查询字符串会影响将返回的内容,因此它将从服务器获取最新资源。

如果直接从书签访问旧的URI,则这些技术均无效。除非指示浏览器重新验证上次缓存的请求上的URI(或缓存的资源已过期),否则它不会进行完全读取来刷新其缓存。这将我们带入下一个主题。

HTTP标头字段

每个资源请求都带有一些称为标头的元信息。相反,每个响应还具有与之关联的标头信息。

在某些情况下,浏览器会看到响应标头值,并在后续请求标头中更改相应的值。这些头值中的那些值会影响在浏览器上执行资源缓存的方式。

HEAD请求和条件请求

一个HEAD请求就像是一个截断的GET或POST请求。HEAD请求不是请求完整的资源,而是仅请求标头字段,否则将在完整请求上返回该标头字段。

通常,资源的标头(以总字节数为单位)比与其关联的资源数据(响应的“正文”)要小得多。标头信息足够提供信息,以允许浏览器确定其缓存中的资源是实时的。

HEAD请求通常用于验证服务器资源的有效性(也就是说,该资源是否仍然存在,如果存在,自浏览器上次访问该资源以来是否已对其进行更新?)。如果HEAD请求指示资源有效,则浏览器将使用其缓存中的内容,否则将执行完整的GET或POST请求,并使用返回的内容刷新其缓存。

通过条件请求,浏览器在标头中发送字段,描述其缓存资源的新鲜度。这次,服务器确定浏览器的缓存是否仍然有效。

如果是,则服务器返回304响应,其中仅包含资源的头信息,而没有资源主体(数据)。如果确定浏览器的缓存已过期,则服务器将返回完整的200 OK响应。

该机制比使用HEAD请求更快,因为它消除了必须发出两个请求而不是发出一个请求的可能性。

以上简化了一个相当复杂的过程。缓存涉及很多微调,但是所有这些都是通过标头字段控制的,其中最重要的是缓存控制。

缓存控制

响应请求时,服务器会将标头字段发送到浏览器,指示在缓存时应适应什么行为。如果我将网页加载到https://en.wikipedia.org/wiki/Uniform_Resource_Identifier,则响应将其包含在其标题记录中:

cache-control: private, s-maxage=0, max-age=0, must-revalidate

私有意味着仅浏览器应缓存文档内容。

s-maxagemax-age设置为0。在S-最大生存周期值是与高速缓存代理服务器,而最大生存周期是用于浏览器。单独设置max-age 的效果是,缓存的资源会立即过期,但是在同一浏览器会话中的页面重新加载期间,它仍然可以使用(即使过时)。

可以通过HEAD请求重新验证陈旧的资源,取决于响应,此请求可能后跟GET或POST请求。在必重新验证指示命令的浏览器重新确认高速缓存资源,如果它是陈旧的。

由于在这种情况下max-age设置为0,因此一旦接收到缓存的资源,该资源将立即失效。这两个指令的组合等效于单个指令no-cache

这两个设置可确保浏览器始终重新验证缓存的资源,无论是否仍在同一会话中。

缓存控制指令非常广泛,有时会令人困惑–它们本身就是一个主题。完整的指令清单可在此处找到。

电子标签

这是服务器发送的令牌,浏览器会保留到下一个请求。仅当浏览器知道资源的缓存生存期已过期时才使用此方法。

电子标签是服务器生成的哈希值,通常将资源的物理文件名和服务器上的上次修改日期用作种子。更新资源文件时,修改的日期会更改,并且会生成一个新的哈希值,并在响应标头中将其发送到请求。

其他影响缓存的标头标签

标头标记已过期最后修改的标记几乎已过时,但大多数服务器仍会发送这些标记,以实现与旧版浏览器的向后兼容性。一个例子:

expires: Thu, 01 Jan 1970 00:00:00 GMT
last-modified: Sun, 01 Mar 2020 17:59:02 GMT

在这里,过期时间设置为第零个日期(从UNIX操作系统开始,历史上一直如此)。这表明资源立即过期,就像max-age = 0一样。上次修改时间告诉浏览器何时对资源进行了最新更新,然后可以使用它来决定是否应重新获取资源,而不是使用缓存值。

从浏览器强制刷新缓存

什么是重载?

重新加载会强制重新获取页面上的所有资源,无论它们是内容,脚本,样式表还是媒体。几乎所有的东西,对不对?

好吧,某些资源可能未明确包含在页面上。取而代之的是,它们通常可以在显式加载完成后动态获取。

浏览器事先不知道会发生这种情况,并且当发生这种情况时,以后的请求(通常由脚本启动)将仍然使用这些资源的缓存副本(如果有)。

什么是明确的缓存和重载?

此操作将清除整个浏览器缓存,其作用与重载相同,但同时也会导致获取动态加载的资源–毕竟,缓存中没有任何内容,因此别无选择!

内容交付网络:地理位置缓存

Screenshot-2020-03-06-at-12.40.14-PM

 

CDN不仅仅是缓存,但缓存是其工作之一。CDN将数据存储在地理位置分散的位置,从而减少了往返于本地地理浏览器的往返时间。

浏览器请求被路由到附近的CDN,从而缩短了必须传输的物理距离响应数据。CDN还能够处理大量流量,并提供针对某些类型攻击的安全性。

CDN通过Internet交换点(IXP)来获取其资源,IXP是Internet的骨干网的一部分(上限)。需要采取一些步骤来设置请求路由以转到CDN而不是主机服务器。下一步是确保CDN具有您网站的当前内容。

在过去,大多数CDN都支持推送方法:网站会将新内容推送到CDN集线器,然后将其分发到地理位置分散的节点。

如今,大多数CDN都使用上述(或类似的)缓存协议来 下载新资源 / 刷新现有资源。浏览器仍然保存有其缓存,这些都没有改变。CDN所做的只是使新资源的传输更快。

本文来自投稿,不代表微擎百科立场,如若转载,请注明出处:https://www.w7.wiki/develop/3951.html

发表评论

登录后才能评论