我希望通过在链接/脚本标记src的末尾添加?v=number
,基于.NET项目中的代码更改(对DLL的更改)为我们的JavaScript和CSS实现缓存清除路径。我想以最高效的方式执行此操作,因为这将在应用程序的每个页面上使用。只需获取DLL版本就是生成该数字的最佳方式,如here所解释的那样?
答案 0 :(得分:3)
缓存是计算机科学中最难的问题之一。适合所有问题没有神奇的答案,因为缓存是一种优化技术:您需要权衡以获得您感兴趣的性能配置文件。只有您知道什么是“最佳”的问题。
对于HTTP,有一系列标题向客户端指示它们应如何执行缓存。与所有标题一样,客户可以选择忽略它们并做自己的事情,但是你应该感到很舒服,大多数客户会注意你发回的内容。
此讨论的相关标题是:
cache-control
etag
此标头向客户端返回应该应用的基本缓存规则。如果未指定此标头,则客户端可以自行选择有关缓存的操作。如果您没有发送此标题,则无法对客户的行为做出许多假设。
cache-control
标头由许多指令组成,用于指示要应用于资源的缓存规则。常见的是:
private | public
- private
指令表明代理服务器不应该缓存此值;缓存的责任完全在于客户。 public
指令表示代理服务器可以缓存此资源。如果您正在为最终用户定制的资源(例如在页面上某处具有用户名),则private
指令是合适的。如果您提供的是所有用户共享的资源,public
是合适的(例如图标或徽标)。max-age
这表示在客户端返回另一个副本之前应该缓存资源的秒数,而不管其他任何缓存策略。这是资源保留在客户端缓存中的最长时间。no-cache
这告诉客户不要每次都缓存资源并检查新版本。这并不意味着客户端根本不缓存资源,而是每次发出请求时它都会检查资源是否已更改。 etag
标题将与此相关。no-store
这表示客户端根本不应存储响应。表示动态资源(每个请求都会更改的资源)的cache-control
值为:
cache-control: no-cache
这告诉客户端和任何代理服务器每次发出请求时都应检查此资源。
将资源缓存1天的cache-control
标头如下所示:
`cache-control: public, max-age=86400
etag
标头是实体标签的缩写。您可以将etag
标头视为资源的哈希码。当您提供此标头时,您可以为客户端提供一种方法来确定资源是否已更改,而无需检索整个资源。
当客户端的资源值为etag
时,它可以向服务器发出请求,就像“如果etag
值与我的etag
值不同,请给我这个资源”。 。您仍然需要进行网络往返的费用,但是如果值已更改,您的客户端将只接收新资源。
etag
标头在节省带宽方面最有用。如果您使用的是etag
,则客户端只会在实际更改时下载新版本,否则将无限期地缓存该值。与重新下载完整资源相比,客户端所做的请求非常小且完整得快。
将cache-control
与cache-control
合并后,etag
标头决定本地缓存值何时不再有效,etag
用于后续请求看资源是否已经改变。
根据您使用的框架和库,有许多方法可以控制这些标头值,但您需要对要设置它们的内容做出明智的猜测。
我建议你可以便宜地制作一个,将etag
应用于响应是一种简单的方法来实现你所要求的分解。您通常应该将cache-control
与max-age
标头合并,该标头包含{{1}}值,该值适用于您在更改值时需要客户端“响应”的程度。
最后请注意,不要忘记缓存是一种优化。如果缓存成本不值得付出,你可以将其关闭。