浏览器有两种缓存策略:一种是需要发送请求,一种是不需要发送请求。强缓存和协商缓存
强缓存:浏览器第一次发送请求后,服务器会返回缓存标识,在http/1.0时是expires,http/1.1时是cache-control。当浏览器需要运用资源的时候,它会去查看文件缓存标识和是否过期,如果没有过期就直接从缓存中获取资源。
expires:规定一个缓存失效时间,过了这个规定的时间,浏览器就需要重新发送请求获取资源。但是这有一个缺陷,就是浏览器和服务器的时间有可能不一样有误差。
cache-control:规定一个字段max-age,这个字段规定了一段有效的时常不是规定具体时间失效,也就是服务器返回后max-age时长能用缓存,这个还可以配合其他指令比如private只能服务器缓存,代理不能缓存。no-cache跳过当前强缓存直接进行协商缓存。no-store不进行任何缓存。s-maxage是给代理服务器规定缓存时长。
当expires和cache-control同时存在浏览器是优先使用cache-control。
协商缓存:在过期时常过期和缓存标识失效时,也就是强缓存失效后,浏览器开始采取协商缓存策略。浏览器会在请求头中携带tag,服务器会根据tag来判断是否启用协商缓存。tag分为两种:Etag和last-modified。
last-modified:第一次请求后服务器会返回给它最后一次修改的时间。当浏览器再次发送请求时会在头部添加tag,这个tag里有上一次改动的时间,如果请求头中的时间小于更新的时间,那么服务器就会重新发送响应数据给浏览器。否则返回304,浏览器可以继续读取缓存数据。
Etag:浏览器第一次发送请求后,服务器是根据当前文件内容然后给文件生成唯一标识符,浏览器把这个携同响应头发送给服务器。当浏览器再次发送请求给服务器,在请求头中也会携带这个唯一标识符,服务器会进行比对,如果不一样则重新发送数据和唯一标识符,不然就返回304,继续读取缓存中的数据。
last-modified有缺陷比如在一秒内文件修改数次就不能检测出,浏览器还是读取的旧缓存。但是在性能上last-modified由于Etag,前者是读取的时间后则是内容。Etag 也有缺陷比如只是编辑了资源文件但是内容并没有改变,这样会造成缓存失效。
缓存地方:service worker cache 、memory cache、disk cache、push cache
service worker cache:运行于浏览器背后,独立于网页有自己的生命周期。可操作性能高,开发人员可以控制缓存内容,如控制仅缓存离线内容或者全部缓存。在离线情况还可以去读取缓存的资源。
memory cache:内存缓存是所有缓存中运行速度最快的,但是内存小缓存保存的时间短
disk cache:磁盘缓存,内存较大,效率比内存缓存低
push cache:是http/2的内容,需要浏览器和服务器同时支持http/2,可以提前预缓存,缓存即将可能需要用到的数据,服务器不在等待浏览器请求时可以主动通过http/2发送数据。极大的提高网页运行速度性能。