文章目录
  1. 1. 如何设置过期缓存头
  2. 2. 何时设置过期缓存头
  3. 3. 何时以及如何在客户端使用过期缓存头
  4. 4. 如何支持复合资源的缓存
  5. 5. 如何保持新鲜且温暖的缓存

缓存时构建HTTP统一接口之上的最有用的功能之一。可以利用缓存减少终端用户感知到的延时,增加可靠性,减少带宽使用和成本,降低服务器负载。缓存无处不在,可以在服务器网络里,内容分发网络(CDN)或是客户端网络里(通常被称作转发代理)。

如何设置过期缓存头

当缓存能在不联系原服务器并能提供响应时,缓存会非常有效率地工作。有到期机制的缓存用于降低原服务器接受请求个数并降低应用所耗带宽。有到期机制的缓存基于Cache-Control和Expires头。这些头指导客户端和缓存在一定时间段内保留服务器返回的表述副本。缓存在时间窗内甚至在时间窗外不联系原服务器使用缓存的表述副本服务后继请求。

基于更新频率,决定缓存到期时间。此时间段后,缓存将认为缓存的表述是陈旧的。Cache-Control头是HTTP 1.1头,其max-value值是以秒为单位的新鲜生命期。为了支持遗留的HTTP 1.0缓存,也要包含Expires头及到期时间。如果决定缓存不应保留副本,使用值为no-cache的Cache-Control头。为了支持支持遗留的HTTP 1.0缓存,也要包含Pragma:no-cache头。

下面列举了Cache-Control指令:

指令            应用
public        默认值。当请求是鉴权过的但仍希望允许共享缓存提供缓存响应服务,也可以用此指令
private        当响应对客户端或用户私有或基于鉴权时使用。当此指令存在时,客户端缓存(例如浏览器缓存和转发代理)可以缓存表述,但服务器上或网络中的共享缓存不能进行缓存。
no-cacheno-store        此指令防止任何缓存存储或提供缓存的表述。
max-age        此指令是以秒为单位的新鲜生命期。
s-maxage        此指令类似于max-age但仅用于共享缓存。当原服务器同事设置了max-age和s-maxage,缓存使用那个s-maxage。实践中,单设max-age就够了。
must-revalidate        使用此指令请求缓存在提供陈旧表述之前检查原服务器。
proxy-revalidate        此指令类似于must-revalidate除了它仅作用于共享缓存。

最佳过期缓存的关键是为资源表述计算一个合理的新鲜寿命值。

像Squid之类的Cache为Cache-Control头提供了两个扩展指令stale-if-error和stale-if-revalidate。服务器使用stale-if-error告知缓存在max-age超时后仍可是使用一段时间的陈旧表述。服务器使用stale-if-revalidate告知缓存在max-age超时后在异步检查服务器响应的同时仍可是使用一段时间的陈旧表述。

何时设置过期缓存头

并不是所有HTTP响应都被缓存。关于HTTP 1.1,GET、HEAD和POSt方法的响应可以缓存,但缓存认为POST方法不可被缓存。对GET和HEAD请求的带有成功状态码的响应设置到期缓存头。无需对其他方法设置到期缓存头。除了带有200 (OK)状态码的成功响应设置到期缓存头,也可以考虑下面的3xx和4xx响应码。这有助于减少来自客户端的错误触发流量。这称之为消极缓存。

状态码                        介绍
300 (Multiple Choices)        带有这个状态码的表述可能很少频繁改变。将此响应缓存可以降低服务器负载。
301 (Move Permanently)        当资源永久搬移,将URI存储在数据库的客户端肯能不会更新。在这种情况下,缓存转发响应可以不联系原服务器。
400 (Bad Request)        当服务器返回此状态码,假定客户端就不会重发请求了。但有些客户端由于软件bug或者故意会重发请求。
403 (Forbidden)        如果服务器永久拒绝服务此资源时添加。
404 (Not Found)        资源不存在时添加
405 (Method Not Allowed)        客户端可能由于软件bug重发请求。
410 (Gone)        资源不再存在,因此缓存应尽可能为此返回错误响应。

何时以及如何在客户端使用过期缓存头

除非是在构建一个封装在压缩包内的,需要用户安装并运行的客户端应用程序,否则应该避免在客户端应用程序支持到期缓存,而是在客户端网络部署转发代理缓存,并且避免在客户端代码实现自己的缓存层(工作量大、维护复杂且耦合度高)。

如果客户端和服务器在同一个网咯里,不一定需要转发代理。

如何支持复合资源的缓存

复合资源中有一些数据是不经常改变的,而有一些数据可能是频繁改变的。对到期缓存处理和过期头设置基于最易于改变数据的最强新鲜需求制定。

如何保持新鲜且温暖的缓存

支持缓存的一个挑战是在客户端没有发送请求时保持缓存新鲜(数据最新)且温暖(缓存不空)。当客户端上传一个新资源,所有缓存都没有这个资源,因此服务器必须为请求生成表述。一个新部署的缓存,必然是空的,只有随着客户端开始请求后才能进行填充。温暖的缓存避免冷启动问题。尽可能将超时与更新频率同步。如果不可能,实现监控数据库等新、定时通过无条件GET请求更新缓存的后台进程。如果使用Squid,使用HTTP缓存通道扩展将资源更新复制到缓存。

文章目录
  1. 1. 如何设置过期缓存头
  2. 2. 何时设置过期缓存头
  3. 3. 何时以及如何在客户端使用过期缓存头
  4. 4. 如何支持复合资源的缓存
  5. 5. 如何保持新鲜且温暖的缓存