HTTP 缓存管理详解

120 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

1. Web 缓存的分类

  • 数据库缓存,常用的数据库缓存比如配合使用memcache、redis这种高性能的分布式内存缓存服务器。
  • 服务器缓存,主要分为代理服务器缓存和CDN缓存。
    • 代理服务器缓存,代理服务器是浏览器和源服务器之间的中间服务器。代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。
    • CDN 缓存,CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展并获得更好的性能。通常情况下,浏览器先向CDN网关发起Web请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态将请求转发到合适的源服务器上。从浏览器角度来看,整个CDN就是一个源服务器。
  • 浏览器缓存,是我们本文讨论的重点,每个浏览器都实现了 HTTP 缓存,我们通过浏览器使用HTTP协议与服务器交互的时候,浏览器就会根据一套与服务器约定的规则进行缓存工作。

2. 协商缓存与强缓存

如果浏览器命中强缓存,则不需要给服务器发请求;而协商缓存最终由服务器来决定是否使用缓存,即客户端与服务器之间存在一次通信。

在 chrome 中强缓存(虽然没有发出真实的 http 请求)的请求状态码返回是 200 (from cache);而协商缓存如果命中走缓存的话,请求的状态码是 304 (not modified)

3. 缓存设置

  • Expires,用于设置静态资源的过期时间。
  • Cache-Control, 相对时间。
  • Last-modify, 是一个时间标识该资源的最后修改时间,当浏览器再次请求该资源时,当资源过期(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。
  • ETag,对于每一个url生成唯一的值,资源变化时ETag也发生变化,方便进行文件校验。