浏览器缓存的作用: 极大的改善网站性能,提高用户体验
浏览器缓存的定义: 浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次浏览该页面时,浏览器可以直接从本地磁盘中加载文档。
浏览器缓存的类型:1 强缓存; 2 协商缓存。浏览器采用哪种缓存类型由响应的header内容来决定
强缓存需要关注的参数:
Expires:判断缓存是否失效
Cache-Control:
-no-cache:不使用本地缓存,需要使用协商缓存,先与服务器确认返回的响应是否被更改,如果之前的响应中存在Etag,那么请求的时候会与服务器端验证,如果资源未被修改,则可以避免重新下载
-no-store:直接禁止浏览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源
-public:可以被所有用户缓存,包括终端用户和CDN等中间代理服务器
-private:只能被终端服务器缓存,不允许CDN等中继缓存服务器对其缓存
PS:如果Expires和Cache-Control同时存在,cache-control的优先级高于expires
两者的异同点:共同点是都是从客户端缓存中读取资源
不同点是强缓存不会发送请求,协商缓存会发送请求
协商缓存,正如其名:通过服务器来告知缓存是否可用,所以客户端和服务端是需要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问
协商缓存需要关注的参数:Etag/If-None-Match、Last-Modified/If-Modified-Since
第一组是对内容采用某种算法生成的hash值,后者是时间,精确到秒。
1 在精确度上Etag要优于Last-Modified。对于1s改变很多次的就无法判断了
2 在性能上Etag要逊于Last-Modified。毕竟计算hash是需要时间的
3 在优先级上Etag要高于Last-Modified,服务器优先校验Etag
浏览器后续进行请求时:
浏览器发送请求,在有缓存的情况下,
首先判断缓存是否过期,如果没有过期,从缓存中读取;
如果过期,判断Etag是否存在,如果存在,向web服务器发送带有If-None-Match的请求,如果Etag和服务器端新生成的Etag一致,则响应码为304,此时,响应的header会更新,但是内容不会更新,从缓存中读取;如果不一致,则更新内容;
如果Etag不存在,判断Last-Modified,在指定时间之内,向web服务器发送带有If-Modified-Since的请求,如果未被修改,响应码为304则从缓存中读取,否则响应码200,更新内容