面试官:“http缓存你了解吗?”

首先,什么是HTTP缓存,先大概说一下。

Http缓存分两种,一种强制缓存,一种协商缓存。
一般Http只能缓存get请求返回的资源,然后
Http缓存发生在第一次请求之后,(不包括第一次哦)
第一次正常请求,服务器返回资源。
从第二次请求开始,浏览器进行请求参数的判断,如果命中了强制缓存,则状态码200,在本地缓存中直接读取资源。否则则会发起请求,服务器经过请求头中的缓存参数进行判断是否命中协商缓存,如果命中协商缓存,则不返回资源,状态码返回304,从本地缓存中读取资源,其他情况则服务器返回资源。

下边稍微深入点说说上边的细节,
那么上边说了通过请求头的参数判断 强制缓存 / 协商缓存, 那么是哪些参数呢?

强制缓存: Pragma, CaChe-Control, Expires
协商缓存: ETag/if-Not-Match, Last-Modified/if-Modified-Since

Pragma

可选值:no-cache(不直接使用缓存,根据新鲜度来使用缓存)
注意点:
1.它的优先级是最高的;
2.响应头 不支持这个属性;
3.在HTTP/1.1中已经被废弃了

Cache-Control

可选值:
1.no-cache(不直接使用缓存,根据新鲜度来使用缓存)
2.no-store(不使用缓存,每次都是请求下载新资源)
3.max-age:xx秒(缓存时长)
4.public/private(是否只能被单个用户使用,默认是private)
5.must-revalidate(每次访问需要缓存校验)
注意点:
1.它的优先级次于Pragma
2.用于HTTP/1.0之后(不包含1.0)
3.在缓存未失效前,获取不到修改后的资源

Expires

可选值:GMT时间
注意点:
1.它的优先级在强制缓存中是最低的
2.在缓存未失效前,获取不到修改后的资源
3.可用于HTTP版本 1.0+

接下来就是协商缓存,协商缓存有两组,ETag / if-not-Match 是一对
第一次请求之后服务器返回数据,在返回头中有ETag属性,ETag的值是一个由服务器端生成的一个序列值,一般是个hash值,然后在客户端下一次请求此数据的时候会在请求头中携带上if-not-Match属性,值则是Etag返回的那个值,服务器收到请求后会对比此值是否相同,来判断是否需要返回新的资源。它非常的精准,可以计算一秒内的多次修改,但是它的计算会耗费性能。

另外一组是 last-Modified / if-Modified-Since
第一次请求之后服务器返回数据,在返回头中有last-Modified属性,last-Modified的值是GMT格式的时间,代表着资源最后一次修改的时间,然后在客户端下一次请求此数据的时候会在请求头中携带上last-Modified-Since属性,值则是Last-Modified返回的GMT时间,服务器收到请求后会对比此值是否相同,来判断是否需要返回新的资源。它以秒为单位,监听不到在一秒内的多次修改,所以不是绝对精确。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容