09月20, 2016

浏览器缓存机制

浏览器缓存机制

只有GET请求才会被缓存

缓存优点

  1. 减少了冗余的数据传输,节省了网络请求
  2. 减少了服务器的负担,大大提升了网站的性能
  3. 加快了客户端加载网页的速度

缓存分类

本地缓存不生效时,会启用协商缓存。HTTP缓存策略主要由HTTP的头(HEADER)控制。

alt

本地缓存(强缓存)

本地缓存是指当浏览器请求资源时,如果命中了浏览器本地的缓存资源,那么浏览器就不会发送真正请求给服务器。

请求过程

  1. 第一次浏览器发送请求给服务器时,此时浏览器还没有本地缓存副本,服务器返回资源给浏览器,响应码是200 OK; 浏览器收到资源后,把资源和对应的响应头一起缓存下来。

  2. 第二次浏览器准备发送请求给服务器时候,浏览器会先检查上一次服务端返回的响应头信息中的Cache-Control(单位:秒,资源在客户端缓存的最大有效期);过期时间为第一次请求的时间加上Cache-Control的值,过期时间跟当前的请求时间比较,如果本地缓存资源没过期,那么命中缓存,不再请求服务器。

如果没有命中,浏览器就会把请求发送给服务器,进入缓存协商阶段。 alt

Expires

只要发送请求时间是在Expires之前,那么本地缓存始终有效,否则就会去服务器发送请求获取新的资源。如果同时出现Cache-Control:max-age和Expires,那么max-age优先级更高。 他们可以这样组合使用:

Cache-Control:public Expires: Mon, 10 Jun 2015 21:31:12 GMT

Cache-Control

public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。

private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。

max-age:当前请求开始,允许获取的响应被重用的最长时间(秒)

no-store:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求, 每次都会下载完整的资源。

no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。

协商缓存

协商缓存的几种情况:

  1. 当第一次请求时服务器返回的响应头中没有Cache-Control和Expires Cache-Control和Expires过期抑或它的属性设置为no-cache时 浏览器第二次请求时就会与服务器进行协商,询问浏览器中的缓存资源是不是旧版本,需不需要更新。

  2. 此时,服务器就会做出判断,如果缓存和服务端资源的最新版本是一致的,那么就无需再次下载该资源,服务端直接返回304 Not Modified 状态码; 如果服务器发现浏览器中的缓存已经是旧版本了,那么服务器就会把最新资源的完整内容返回给浏览器,状态码就是200 Ok;

Etag作用

  1. 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

  2. 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);

  3. 某些服务器不能精确的得到文件的最后修改时间。

304状态码:

通过If-Modified-Since If-Match判断资源是否修改,如未修改则返回304,发生了一次请求,但请求内容长度为0,节省了带宽。 如果有多台负载均衡的服务器,不同服务器计算出的Etag可能不同,这样就会造成资源的重复加载。

跳过浏览器缓存的小技巧

每次的请求地址加上时间戳使得地址不同,从而跳过浏览器的缓存

本文链接:http://inkzhou.com/post/cache.html

-- EOF --

Comments