强缓存和协商缓存的小结

之前陆陆续续看了许多关于缓存的文章,现在梳理一下自己的理解。

强缓存不会与服务器发生通信

        与强缓存相关的header字段是 Cache-Control(时间长度)(http1.1) 和 Expires(时间戳)(http1.0), Cache-Control的优先级大于Expires。

协商缓存会与服务器发生通信,是否下载response返回浏览器要根据协商缓存的结果,若命中协商缓存则直接返回304Not Modified,若没有命中则重新下载response返回浏览器

       与协商缓存相关的header字段是Eag(资源生成的唯一的标识字符串)(http1.1)和Last-Modified(资源最后修改时间)(http1.0),Tag的优先级大于Last-Modified。

 

第一次请求时,服务器返回的response header中包含expries. expires 是一个时间戳,然后第二次向服务器请求资源,浏览器就会先对比本地时间和 expires 的时间戳,如果本地时间小于 expires 设定的过期时间,那么就直接去缓存中取这个资源。问题在于这个是依赖于本地时间的。所以HTTP1.1 新增 Cache-Control 字段来完成 expires 的任务。 Cache-Control是一个有效时间,是一个时间长度,在这个时间内,强缓存都是有效的。

 

第一次请求时,服务器返回的response header中包含Last-Modified,然后第二次向服务器请求资源,浏览器会携带If-Modified-Since:值为上次请求时服务器返回的response header中包含的Last-Modified的值,然后服务器会将If-Modified-Since的值与资源的最后修改时间比对,若不相等,就会返回一个完整的响应内容,并在 Response Headers 中添加新的 Last-Modified 值;若相等,返回 304 响应,并且Response Headers 不会再添加 Last-Modified 字段。Last-Modified有一些问题就是不能够精准的描述资源的变化情况,如果资源被编辑但是未修改里面的内容则会有误差,以及Last-Modified是以秒为单位的,不能够准确描述资源的变化情况。所以Eag出现了,E-tag是服务器根据资源内容生成的唯一标识,这个标识只与内容相关,所以可以准确描述资源的变化情况,当就像服务器开启gzip压缩一样,这个E-Tag也会消耗服务器资源,对应的是请求头的If-None-Match。

你可能感兴趣的:(强缓存和协商缓存的小结)