web缓存web缓存定义web缓存是指存在于web服务器和客户端(浏览器)之间的web资源(如html页面、图片、js、数据等)的副本。缓存会根据传入的请求保存一份输出内容;下一次请求到来时,如果是同一个URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是再次向源服务器发送请求。更常见的是,浏览器会缓存所访问网站的网页。当再次访问该URL地址时,如果网页没有更新,则不会再次下载该网页,而是直接使用本地缓存的网页。只有当网站明确标识该资源已更新时,浏览器才会重新下载该页面。至于浏览器和Web服务器如何识别网页是否更新的机制,后面会介绍。网页缓存的作用是降低网络带宽消耗:无论对于网站运营商还是用户来说,带宽都代表着金钱,过多的带宽消耗只会让网络运营商更便宜。使用web缓存副本时,只产生极少的网络流量,可有效降低运营成本。减轻服务器压力:为网络资源设置有效期后,用户可以复用本地缓存,减少对源服务器的请求,间接减轻服务器压力。同时,搜索引擎的爬虫机器人也可以根据过期机制降低爬虫的频率,也可以有效的减轻服务器的压力。减少网络延迟,加快页面打开速度:带宽对于个人网站运营商来说非常重要,但是对于大型互联网公司来说,有时候他们真的不在乎,因为他们有很多钱。Web缓存是否仍然有效?答案是肯定的。对于终端用户来说,缓存的使用可以显着加快页面打开速度,获得更好的体验。Web缓存的类型数据库数据缓存服务器端缓存前端缓存Web应用层缓存前端缓存分类HTTP缓存http缓存http缓存是指:客户端向服务器请求资源时,首先到达浏览器缓存,如果浏览器有“请求资源的副本”,资源可以直接从浏览器缓存中获取,而不是从源服务器中获取。普通的http缓存只能缓存get请求响应的资源,对于其他类型的响应什么都做不了,所以后面说的请求缓存指的就是GET请求。HTTP缓存从第二个请求开始。第一次请求资源时,服务端返回资源,并在响应头中返回资源的缓存参数;浏览器在第二次请求判断这些请求参数时,如果命中强缓存则直接200,否则会在请求头中添加请求参数传递给服务器,看是否命中协商缓存,以及如果命中则返回304,否则服务器将返回一个新的资源。http缓存规则的新鲜度(过期机制):即缓存副本的有效期。一个缓存的副本必须满足以下任一条件,浏览器会认为它有效且足够新,可以直接从缓存中获取并渲染该副本:它包含完整的过期时间控制头信息(HTTP协议头),并且仍然是浏览器在有效期内已经使用过这个缓存的副本,并且在一次会话中检查过新鲜度校验值(认证机制):当服务器返回一个资源时,有时会携带资源的实体标签Etag(实体标签)在controlheaderinformation),可以作为浏览器再次请求进程的验证标识。如果发现验证标识不匹配,则说明该资源已被修改或过期,浏览器需要重新获取资源内容。http缓存的分类是强制缓存。如果缓存的数据没有失效(即Cache-Control的max-age没有过期或者Expires的缓存时间没有过期),则直接使用浏览器的缓存数据,不会再次使用.向服务器发送任何请求。强制缓存生效时,HTTP状态码为200。这样,页面加载速度是最快的,性能也很好,但是在此期间,如果修改了服务器端的资源,它不会在页面上可用,因为它不会再向服务器发送请求。这种情况是我们在开发中经常遇到的。比如你在页面上修改了某个样式,在页面上刷新了但是没有生效。强制缓存相关的头属性有(Pragma/Cache-Control/Expires)max-age(单位为s)指定设置缓存的最大有效时间,定义了时间长度。浏览器向服务器发送请求后,浏览器在max-age时间内不会再向服务器发送请求。让我们寻找一个资源。比如QQ推广上的css资源,max-age=3600,即缓存有效期为3600秒(即1h)。所以这个版本的资源会在1天内使用,即使服务器上的资源发生变化,也不会通知浏览器。s-maxage(单位为s)与max-age相同,只用于共享缓存(如CDN缓存)。比如当s-maxage=60时,在这60秒内,即使CDN的内容有更新,浏览器也不会发起请求。也就是说,max-age用于普通缓存,s-maxage用于代理缓存。如果s-maxage存在,它将覆盖max-age和Expires标头。私有响应仅用作私有缓存,不能在用户之间共享。如果需要HTTP身份验证,响应将自动设置为privatepublic以指定响应将被缓存并在多个用户之间共享。也就是下图的意思。如果既未指定public也未指定private,则默认为public。no-cache:可以缓存在本地,也可以缓存在代理服务器上。每次发起请求,都要经过服务器的验证。服务器可以返回缓存以使用本地缓存。没有节点可以直接使用缓存no-store:browseror代理服务器无法保存返回数据的缓存,总是需要去服务器请求新的数据。协商缓存的执行过程如下:当浏览器第一次向服务器发送请求时,会在响应头中返回协商缓存。头部属性:ETag和Last-Modified,其中ETag返回一个哈希值,Last-Modified返回GMT格式的最后修改时间。那么当浏览器第二次发送请求时,会在请求头中带上ETag对应的If-Not-Match,其值为响应头中返回的ETag的值,而If-Modified-自从。服务端收到这两个参数后,会进行比较。如果返回的是304状态码,说明请求的资源没有被修改,浏览器可以直接从缓存中取数据,否则,服务器直接返回数据。场景测量当文件在强制缓存时间内发生变化时,是否会请求服务器?强制缓存时间过后不会使用协商缓存吗?关闭浏览器后强制缓存时间会重置吗?当缓存时间到期时(304),如果再次访问它会被重置。如果在缓存时间内,则不会重置。no-cash和no-store有什么区别?no-cash会用协商缓存,no-stroe不会用Last-Modified和etag哪个优先级高?HTTP1.1中Etag的出现,主要是为了解决Last-Modified的几个难题:Last-Modified标记的最后一次修改时间只能精确到秒级,如果某些文件在1秒内被多次修改,否则,它将无法准确标记文件的新鲜度。如果有些文件会定时生成,有时候内容没变,但是Last-Modified变了,导致文件无法使用缓存。有可能是服务端没有准确获取文件的修改时间,或者与代理服务器的时间不一致等。Etag是服务端自动生成或者开发者生成的相应资源在服务端的唯一标识,可以更准确地控制缓存。Last-Modified和ETag可以一起使用。服务器会先验证ETag。如果一致,则继续比较Last-Modified,最后决定是否返回304。
