Open Lirx-Xin opened 3 years ago
强缓存主要通过expires与cache-control来设置,强缓存会直接在浏览器端决定是否使用缓存中的数据,而不会去询问服务器;
expires
cache-control
max-age
public
private
no-cache
no-store
immutable
协商缓存作用于当强缓存失效后的缓存策略,主要通过向服务器确定缓存资源是否可用,协商缓存主要通过这两对值来设置:Last-Modified/If-Modified-Since 和 ETag/If-None-Match。
Last-Modified/If-Modified-Since
ETag/If-None-Match
Last-Modified
If-Modified-Since
ETag
If-None-Match
这两种协商缓存各有优点,Last-Modified/If-Modified-Since的方式会有一些导致不该失效的缓存未命中的缺点,但是其性能更好。ETag/If-None-Match因为每次要计算hash值,所以其性能要差很多,但是其更准确。
强缓存与协商缓存
强缓存
强缓存主要通过
expires
与cache-control
来设置,强缓存会直接在浏览器端决定是否使用缓存中的数据,而不会去询问服务器;expires
产生于http/1.0,属于过时产物,当前使用只是为了在不支持cache-control
时作用。 浏览器请求某个资源时,我们可以在该请求的返回头中设置expires字段,值为一个未来的GMT时间点,表示只要没有过这个时间点,对该资源的请求都会命中该强缓存。cache-control
产生于http/1.1,浏览器请求某个资源时,我们可以在该请求的返回头中设置cache-control
字段,其值可以设置max-age public private no-cache no-store等。max-age
值为一个毫秒数,表示从缓存开始,max-age
毫秒时间后,缓存失效。public
表示该数据可以让客户端与代理服务器缓存。private
表示只能让客户端缓存。no-cache
表示让客户端缓存,但是是否生效还是会让协商缓存结果决定,也就是说强缓存结果不重要了,直接前往协商缓存。no-store
表示不使用强缓存也不适用协商缓存。 常用 cahe-control:max-age=31536000,public,immutable;immutable
表示该资源永远不变,但并不是永远不变,所以其作用只是为了让用户点击页面刷新时不去请求服务器,因为用户点击页面刷新按钮时,是不会访问缓存的。协商缓存
协商缓存作用于当强缓存失效后的缓存策略,主要通过向服务器确定缓存资源是否可用,协商缓存主要通过这两对值来设置:
Last-Modified/If-Modified-Since
和ETag/If-None-Match
。Last-Modified
字段,值为该资源的最后一次修改时间,再浏览器再次请求该资源时,会在请求头中携带If-Modified-Since
,值为上次请求保存的Last-Modified
的值,服务器收到If-Modified-Since
头的信息后,会与当前文件的最后一次修改时间对比,如果时间更改了,那么就会再次返回该资源,如果没变,就会返回空的正文信息,这样浏览器就会直接从缓存中取。 此种方式有一些缺点:1,Last-Modified
保存的是绝对时间,精确到秒,如果在一秒内文件改变了,是不会被侦测到。2,文件只改变了修改时间,也会导致缓存失效。3,有的服务器不能准确取到文件的最后修改时间。Last-Modified/If-Modified-Since
类似,区别在于ETag
的方式,第一次请求返回的头字段为ETag,其值为该文件通过一个碰撞散列函数计算的hash值(当文件改变后,该hash值也会改变),在下一次请求时,浏览器会在请求头中设置If-None-Match
,值为上一次的ETag,在服务器端做对比后,如果hash值没变,则会返回空的信息,浏览器就会从缓存中取出该数据。这两种协商缓存各有优点,Last-Modified/If-Modified-Since的方式会有一些导致不该失效的缓存未命中的缺点,但是其性能更好。ETag/If-None-Match因为每次要计算hash值,所以其性能要差很多,但是其更准确。