HTTP 缓存

缓存优点

  • 减少了冗余的数据传输
  • 缓解了网络瓶颈的问题
  • 降低了对原始服务器的请求,降低了服务器的压力
  • 降低了距离时延

缓存分为服务端侧(server side,比如 Nginx、Apache)和客户端侧(client side,比如 web browser)。

服务端缓存又分为代理服务器缓存反向代理服务器缓存(也叫网关缓存,比如 Nginx反向代理)
客户端侧缓存一般指的是浏览器缓存,目的就是加速各种静态资源的访问,
增加用户体验、减轻服务器压力和网络带宽的压力。

浏览器缓存机制详解

浏览器缓存控制机制有两种:HTML Meta标签 vs. HTTP头信息

HTML Meta标签

1
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。

HTTP头信息控制缓存

  • 浏览器第一次请求流程图
    浏览器第一次请求
  • 浏览器再次请求时
    浏览器再次请求

原始服务器的内容可能会发生变化,缓存要经常对其进行检测,看看它们保存的副本是否任是服务器最新版本。
缓存对缓存的副本进行在验证时,会向原始服务器发送一个晓得在验证请求。如果内容没有变化,返回 304 Not Modifield状态码。

如何判断缓存新鲜度

8 第一种, 浏览器把缓存文件的最后修改时间通过 header ”If-Modified-Since“来告诉Web服务器。·
8 第二种, 浏览器把缓存文件的ETag, 通过header “If-None-Match”, 来告诉Web服务器。

通过最后修改时间, 来判断缓存新鲜度

1,浏览器客户端想请求一个文档, 首先检查本地缓存,发现存在这个文档的缓存, 获取缓存中文档的最后修改时间,通过: If-Modified-Since, 发送Request给Web服务器。·
2, Web服务器收到Request,将服务器的文档修改时间(Last-Modified): 跟request header 中的,If-Modified-Since相比较, 如果时间是一样的, 说明缓存还是最新的, Web服务器将发送304 Not Modified给浏览器客户端, 告诉客户端直接使用缓存里的版本

Expires策略:Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
Expires 的一个缺点:返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大(比如时钟不同步,或者跨时区),那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代。

Cache-control策略重点关注):Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。

缺点:

  1. 某些服务器不能精确得到文件的最后修改时间, 这样就无法通过最后修改时间来判断文件是否更新了。·
  2. 某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。
  3. 一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。

ETag

ETag是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。 当资源发送改变时,ETag也随之发生变化。