强缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,则重新发起请求。
Cache-control:
expires是http1.0的属性,http1.1中Expires被Cache-Control替代,Cache-control 的优先级高于 Expires,为了兼容 HTTP/1.0 和 HTTP/1.1,实际项目中两个字段都可以设置。
让客户端与服务器之间能实现缓存文件是否更新的验证、提升缓存的复用率,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。
强缓优先于协商缓存
Last-Modified/If-Modified-Since 的值代表的是文件的最后修改时间,第一次请求服务端会把资源的最后修改时间放到 Last-Modified 响应头中,第二次发起请求的时候,请求头会带上上一次响应头中的 Last-Modified 的时间,并放到 If-Modified-Since 请求头属性中,服务端根据文件最后一次修改时间和 If-Modified-Since 的值进行比较,如果相等,返回 304 ,并加载浏览器缓存。
首次打开响应http 200状态码,header头响应Last-Modified时间
再次刷新时,请求头带上了If-Modified-Since,和之前的资源的修改时间一致,直接响应304状态码,读取的缓存内容
修改文档的修改时间再刷新,响应头的Last-Modified发生改变,和请求头不变,响应http 200,返回资源数据.
Etag 的优先级高于 Last-Modified
ETag/If-None-Match 的值是根据内容生成的hash 码,代表的资源的标识符,当服务端的文件变化的时候,它的 hash码会随之改变,通过请求头中的 If-None-Match 和当前文件的 hash 值进行比较,如果相等则表示命中协商缓存。
ETag 又有强弱校验之分,如果 hash 码是以 "W/" 开头的一串字符串,说明此时协商缓存的校验是弱校验的,只有服务器上的文件差异(根据 ETag 计算方式来决定)达到能够触发 hash 值后缀变化的时候,才会真正地请求资源,否则返回 304 并加载浏览器缓存。
首次访问时,响应200,header头响应了etag
再次访问时,请求头带上了If-None-Match,此时资源校验没有变化直接响应304状态码,读取缓存内容
当我通过画图工具稍微调整了一下图片的尺寸,再次访问时,If-None-Match传递过来的hash和后台计算的不一致,header头重新返回响应的etag hash值,说明文件发生了修改,响应200,重新加载资源
E-tag的协商缓存,基于last-modified补充方案,cache-control可以完全替代expires的功能,在协商缓存中,但是ETag并非last-modified的替代方案,而是一种补充方案,依旧存在些弊端。
last-midify存在的弊端:
e-tag存在的弊端:
服务器生成文件资源的ETag需要计算开销,如果资源的尺寸较大,数量较多且修改比较频繁,那么生成ETag的过程就会影响务器的性能。
ETag字段值的生成分为强验证和弱验证,强验证根据资源内容进行生成,能够保证每个字节都相同;弱验证则根据资源的部分属性值来生成,生成速度快但无法确保每个字节都相同,并且在服务器集群场景下,也会因为不够准确而降低协商缓存有效性验证的成功率,所以恰当的方式是根据具体的资源场景选择恰当的缓存校验方式。
CDN缓存,全称是Content Delivery Network,即内容分发网络。其原理是避开网络上可能存在的不稳定性和速率,使内容传输更快、更稳定。即通过网络各节点处放置节点服务器构成一层智能虚拟网络,能够实时根据网络流量和各节点的链接、负载、距离等因素将用户的请求重新导向最近的节点服务器上,使得用户可能就近获取访问内容,提高响应速率。
CDN拓扑图:
浏览器本地缓存失效后,浏览器会向CDN边缘节点发起请求,类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。CDN边缘节点缓存一般都遵循HTTP标准协议,通过http响应头中的Cache-control: max-age的字段来设置CDN边缘节点数据缓存时间。
当 CDN 缓存服务器中没有符合客户端要求的资源,CDN节点从回源站获取资源的过程叫回源。 CDN缓存时间会对“回源率”产生直接的影响。若CDN缓存时间较短,CDN边缘节点上的数据会经常失效,导致频繁回源,增加了源站的负载,同时也增大的访问延时;若CDN缓存时间太长,会带来数据更新时间慢的问题。
优点:
同一个资源保证url唯一 对不同资源进行组合使用强制缓存、协商缓存及文件指纹或版本号 对于不经常改变的文件使用长期缓存,设置max-age=较大值 引入的一些第三方文件、打包出来的带有hash后缀css、js文件
如果您喜欢我的文章,请点击下面按钮随意打赏,您的支持是我最大的动力。
最新评论