浏览器缓存分类
- 浏览器缓存分为
强缓存
和协商缓存
强缓存
:不用发请求到服务器就能拿到缓存文件的请求(状态码200 注意:正常请求是200,强缓存也是200)协商缓存
:如果没有命中强缓存,浏览器会将资源加载请求发送到服务器。服务器来判断浏览器本地缓存是否有效。如果可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。(需要发送请求到服务器,状态码304)- 如果没有命中强缓存或者协商缓存,服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。(新的请求)
如何判断命中强缓存
- 在Chrome的开发者工具中看到http的返回码是200,在Size列会显示为(from cache)
Status Code:200 OK(from memory cache)
- 强缓存是利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间
- Expires:缓存过期时间,用来指定资源到期的时间,是服务端的具体的时间点。(服务器告诉浏览器在这个
绝对时间
以前都可以命中强缓存,都不需要向服务器发送请求) - Cache-control:是一个
相对时间
,代表着资源的有效期。 - 注意:使用
绝对时间
的方式有一个明显的缺点----当客户端本地时间被修改以后,服务器与客户端时间偏差变大以后,可能会导致缓存混乱。 - Cache-Control与Expires可以在服务端配置同时启用或者启用任意一个,同时启用的时候Cache-Control优先级高。
max-age:指定一个时间长度,在这个时间段内缓存是有效的,单位是s。
强缓存存在的意义
- 服务器的配置是有限的,设置强缓存能够扩充服务器所提供服务的客户端数量。
- 利用用户的电脑配置来分担服务器的压力,从而减小服务器的负担。
- 服务器可以少买几台。
协商缓存(浏览器问服务器我缓存的文件有无更新呀?)
- 没有更新;浏览器可以用缓存。(状态码304)
- 有更新;浏览器不能用缓存,服务器需要发新的给浏览器。(状态码200)
Last-Modify/If-Modify-Since(记录的是时间)
- Last-Modify(响应头里面的 Response Headers):服务器发过来的
- If-Modify-Since(请求头里面的 Request Headers):浏览器发请求
- 判断两者是否相等
ETag/If-None-Match(注意:上面记录时间的方式没有那么精确,所以采用ETag/If-None-Match)
- 返回的是一个校验码,ETag值的变更说明资源状态已经被修改,服务器根据浏览器上发送的If-None-Match值来判断是否命中缓存。(判断两者是否相等,走协商缓存的话应该是相等的。)
总结
(1)http缓存能够帮助服务器提高并发性能,很多资源不需要重复请求直接从浏览器拿缓存
(2)http缓存分类:强缓存和协商缓存
(3)强缓存通过expires和cache-control控制,协商缓存通过last-Modify和E-tag控制
补充:1.为什么有expires还需要cache-control
回答:expires存在服务器和浏览器时间不同步的问题
expires是绝对时间,cache-control是相对时间
2.last-modify和Etag
回答:last-modify它是有时间精度的问题(到秒)
Etag没有精度的问题,只要文件改变,Etag值就会变