最近在做前端面试题系列总结。感兴趣的朋友可以加关注,欢迎指正交流。力求每个知识点多总结,至少面试的时候每个知识点都能说的通,不至于哑火。前言通过前面的介绍,我们知道HTTP缓存分为两种:强缓存协商缓存在上一篇文章中,我们了解了HTTP强缓存。今天我们就来学习一下协商缓存的相关内容。NegotiationCache特点Negotiationcache,也叫比较缓存,从名字就可以看出,它不像强制缓存那么霸道,可以根据业务决定是否使用缓存资源。在协商缓存机制下,浏览器需要发送缓存标识符,验证缓存标识符是否有效给服务器,然后再决定是重新发起请求,下载完整的响应,还是在本地获取缓存的资源。如果服务器提示缓存的资源没有被修改(NotModified),则该资源会被重定向到浏览器缓存。在本例中,网络请求对应的状态码为304。例如,规则协商缓存的整体规则如下:从上图可以看出,虽然客户端还是向客户端发起了HTTP请求服务器,服务器只进行标志比较,以确认是否使用缓存。如果缓存被确认,则不会返回具体的资源。虽然这并没有减少请求的数量,但大大降低了请求负载,可以显着提高请求速度,减少网络带宽。上图是缓存标识符正常有效的时序图,但实际上协商缓存的校验结果有两种情况:标识符有效和标识符过期。协商缓存需要配合强缓存使用。使用协商缓存需要设置Cache-Control:no-cache或pragma:no-cache告诉浏览器不要加强缓存。IdentifierExpirationAttribute对于协商缓存,缓存标识符的传递是我们需要理解的,它是在ResponseHeader和RequestHeader之间传递的。缓存标识符可以分为两类:Last-ModifiedandIf-Modified-SinceEtag和If-None-Match。我们一般说协商缓存的缓存标识是Last-Modified(最后修改时间)和Etag(标签或名称),因为这两者都是由服务器确定并返回的。浏览器带有判断性的属性——If-Modified-Since(是否从什么时候开始改变)和If-None-Match(是否不能匹配)。缓存标识的携带位置如下图所示:在一个特定的网络请求中,缓存标识如下图所示:Last-Modified和If-Modified-SinceLast-Modified和If-Modified-Since被引入通过HTTP1.0。Last-Modified当浏览器第一次访问资源时,服务器会在Response和Header中返回一个Last-Modified,代表该资源的最后修改时间。当If-Modified-Since再次请求服务器时,请求头中会携带该字段,即上次请求时服务器返回的Last-Modified的值。服务器收到请求后,发现有一个headerIf-Modified-Since,将其与请求资源的最后修改时间进行比较:如果资源的最后修改时间大于If-Modified-Since,则表示资源又被改变了,然后响应整个文件的资源内容,返回状态码200和最新的资源,响应头中携带最新的缓存标识Last-Modified。如果资源的最后修改时间小于等于If-Modified-Since,说明资源没有新的修改,会响应HTTP304,告诉浏览器继续使用保存的缓存。缺陷使用Last-Modified有一定的缺陷:如果资源更新速度在秒以下,则无法使用缓存,因为If-Modified-Since只能检查以秒为最小计量单位的时间差。如果文件是服务器动态生成的,虽然文件可能不会改变,但这种方法的更新时间永远是生成的时间,所以不能起到缓存的作用。我们编辑了文件,但文件的内容没有改变。服务器并不知道我们是否真正更改了文件,它仍然以最后一次编辑时间来判断。因此,当这个资源再次被请求时,它会被当作一个新的资源,从而触发一个完整的响应——当它不应该被重新请求时,它会被重新请求。为了解决上述服务端不能正确感知文件变化的问题,Etag作为Last-Modified的补充出现。Etag和If-None-MatchEtag和If-None-Match是一对headers,属于HTTP1.1。ETag和If-None-Match的值是一串哈希码,代表一个资源标识。当服务器上的文件发生变化时,它的哈希码也会随之变化。Etag服务器响应请求时,告诉浏览器当前资源在服务器上的唯一标识(生成规则由服务器决定)。ETag也分为强校验和和弱校验。如果哈希码是一串以“W/”开头的字符串,说明此时协商缓存的校验和是弱校验,只有服务器上的文件差异(根据ETag计算(通过方式确定)触发hash值后缀的变化,才会真正请求资源,否则返回304,加载浏览器缓存,当If-None-Match再次请求服务器时,会使用该字段通知服务器唯一clientsegment缓存数据的标识,服务端收到请求后,发现有一个headerIf-None-Match,将其与请求资源的唯一标识进行比较:如果不同,则说明该资源已经被再次更改,然后响应整个资源内容并返回状态码200。同样的,说明资源没有新的修改,它会响应HTTP304,告诉浏览器继续使用保存的缓存。缺陷Etag的生成过程需要服务器付出额外的开销,这会影响服务器的性能,这是它的劣势。因此,启用Etag需要我们审时度势:Etag不能替代Last-Modified,它只能作为Last-Modified的补充和增强而存在。Etag比Last-Modified在感知文件变化方面更准确,优先级更高。当Etag和Last-Modified同时存在时,以Etag为准。对比两个属性的准确率,Etag要优于Last-Modified。Last-Modified的时间单位是秒。如果一个文件在1秒内发生了多次更改,则实际上不会反映出它们的Last-Modified。修改,但Etag每次都会变化,以保证准确性。在性能方面,Etag不如Last-Modified。毕竟Last-Modified只需要记录时间,而Etag则需要服务器通过算法计算出一个hash值。在优先级上,服务器验证优先考虑Etag。总结以上内容:协商缓存依赖于缓存标识符来判断资源是否有效。缓存标识符包括Last-Modified(If-Modified-Since)和Etag(If-None-Match)。响应头携带Last-Modified和Etag。请求头携带If-Modified-Since和If-None-Match。Etag是Last-Modified的补充和改进,不能完全替代Last-Modified。Etag优先于Last-Modified。Last-Modified的性能高于Etag,但准确率不如Etag。以上就是HTTP协商缓存的相关内容。~~本文到此结束,感谢阅读!~学习有趣的知识,认识有趣的朋友,塑造有趣的灵魂!大家好,我是〖编程三昧〗的作者王隐,我的公众号是《编程三昧》,欢迎关注,希望大家多多指教!你来,怀揣期待,我以墨香迎接你!您归来,不分得失,只送回味!知识与技能并重,内功与外功并重,理论与实践两手抓,两手都要用力!
