Web缓存基础:术语、HTTP报头和缓存策略(3)

public:它将内容标记为公有的,这意味着它能被浏览器和其他任何中间节点缓存。通常,对于使用了HTTP验证的请求,其回复被默认标记为private。public标记将会覆盖这个设置。

private:它将内容标记为私有的。私有数据可以被用户的浏览器缓存,但不能被任何中间节点缓存。它通常用于用户相关的数据。

max-age:这个设置指示了缓存内容的最大生存期,它在最大生存期后必须在源服务器处被验证或被重新下载。在现代浏览器中这个选项大体上取代了Expires头部,浏览器也将其作为决定内容的新鲜度的基础。这个选项的值以秒为单位表示,最大可以表示一年的新鲜期(31536000秒)。

s-maxage:这个选项非常类似于max-age,它指明了内容能够被缓存的时间。区别是这个选项只在中间节点的缓存中有效。结合这两个选项可以构建更加灵活的缓存策略。

must-revalidate:它指明了由max-age、s-maxage或Expires头部指明的新鲜度信息必须被严格的遵守。它避免了缓存的数据在网络中断等类似的场景中被使用。

proxy-revalidate:它和上面的选项有着一样的作用,但只应用于中间的代理节点。在这种情况下,用户的浏览器可以在网络中断时使用过期内容,但中间缓存内容不能用于此目的。

no-transform:这个选项告诉缓存在任何情况下都不能因为性能的原因修改接收到的内容。这意味着,缓存不允许压缩接收到的内容(没有从原始服务器处接收过压缩版本的该内容)并发送。

这些选项能够以不同的方式结合以获得不同的缓存行为。一些互斥的值如下:

no-cache,no-store以及由其他前面未提到的选项指明的常用的缓存行为

public和private

如果no-store和no-cache都被设置,那么no-store会取代no-cache。对于非授权的请求的回复,public是隐含的设置。对于授权的请求的回复,private选项是隐含的。他们可以通过在Cache-Control头部中指明相应的相反的选项以覆盖。

开发一种缓存策略

在理想情况下,任何内容都可以被尽可能缓存,而您的服务器只需要偶尔的提供一些验证内容即可。但这在现实中很少发生,因此您应该尝试设置一些明智的缓存策略,以在长期缓存和站点改变的需求间达到平衡。

常见问题

在许多情况中,由于内容被产生的方式(如根据每个用户动态的产生)或者内容的特性(例如银行的敏感数据),这些内容不应该被缓存。另一些许多管理员在设置缓存时可能面对的问题是外部缓存的数据未过期,但新版本的数据已经产生。

这些都是经常遇到的问题,它们会影响缓存的性能和您提供的数据的准确性。然而,我们可以通过开发提前预见这些问题的缓存策略来缓解这些问题。

一般性建议

尽管您的实际情况会指导您选择的缓存策略,但是下面的建议能帮助您获得一些合理的决定。

在您担心使用哪一个特定的头部之前,有一些特定的步骤可以帮助您提高您的缓存命中率。一些建议如下:

为图像、CSS和共享的内容建立特定的文件夹:将内容放到特定的文件夹内使得您可以方便的从您的站点中的任何页面引用这些内容。

使用同样的URL来表示同样的内容:由于缓存使用内容请求中的主机名和路径作为键,因此应保证您的所有页面中的该内容的引用方式相同,前一个建议能让这点更加容易做到。

尽可能使用CSS图像拼接:对于像图标和导航等内容,使用CSS图像拼接能够减少渲染您页面所需要的请求往返,并且允许对拼接缓存很长一段时间。

尽可能将主机脚本和外部资源本地化:如果您使用Javascript脚本和其他外部资源,如果上游没有提供合适的缓存头部,那么您应考虑将这些内容放在您自己的服务器上。您应该注意上游的任何更新,以便更新本地的拷贝。

对缓存内容收集文件摘要:静态的内容比如CSS和Javascript文件等通常比较适合收集文件摘要。这意味着为文件名增加一个独特的标志符(通常是这个文件的哈希值)可以在文件修改后绕开缓存保证新的内容被重新获取。有很多工具可以帮助您创建文件摘要并且修改HTML文档中的引用。

对于不同的文件正确地选择不同的头部这件事,下面的内容可以作为一般性的参考:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ad92c13b9ca6e640a9ad657b8567d53e.html