HTTP缓存
什么是Web缓存
Web缓存是可以自动保存常见文档副本的HTTP设备(浏览器或缓存服务器)。当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取该文档。缓存的优点如下:
- 减少冗余的网络传输,节省网络费用;
- 缓解网络瓶颈问题,不需要更多的带宽就能够更快的加载页面;
- 降低对原始服务器的要求;
- 降低了距离时延。
缓存时效性
缓存的优点很明显,但是使用时,时效性是很重要的。开发者要在充分发挥缓存优点与确保用户使用的文档是最新的之间取得平衡。以下是相关概念:
命中、未命中
- 缓存命中:可以用已有的副本为某些到达缓存的请求提供服务。
- 缓存未命中:到达缓存的请求由于没有副本可用,而被转发到原始服务器。(请求到达原始服务器,并且服务器响应携带最新文档)
再验证(revalidation
)
原始服务器的内容可能会发生变化,缓存要不时对其进行检测,看看它们保存的副本是否是服务器上最新的副本。这些“新鲜度检测”被称为HTTP_再验证_(revalidation
)。
再验证触发的时机,一般是客户端发起请求,并且副本旧得足以需要检测的时候,才会对副本进行再验证。为了有效地进行再验证,HTTP定义了一些特殊的请求,不用从服务器上获取整个对象,就可以快速检测出内容是否是最新的。(条件请求)
- 缓存对副本进行再验证时,会向原始服务器发送一个小的再验证请求。如果内容没有变化,服务器会以一个小的304 Not Modified进行响应。只要缓存知道副本仍然有效,就会再次将副本标示为暂时新鲜的,并且副本提供给客户端,这被称作
再验证命中
。 再验证未命中
:服务器对象与已缓存的副本不同,服务器向客户端发送一条普通的、带有完整内容的HTTP 200 OK响应。对象被删除
:如果服务器对象已经被删除了,服务器就会送一个404 Not Found 响应,缓存也会将其副本删除。
缓存的处理步骤
接收
缓存从网络中服务抵达的请求(GET)报文。
解析
缓存对报文进行解析,提取出URL和各种首部。
查询
缓存查看是否有本地副本可用,如果没有,就获取一份副本并将其保存在本地。已缓存对象中包含了服务器响应主体(副本文件)和原始服务器响应首部,这样就会在缓存命中时返回正确的服务器首部。
新鲜度检测
HTTP通过缓存将服务器文档的副本保留一段时间,在这段时间里,都认为文档是“新鲜的”,缓存可以在不联系服务器的情况下,直接提供该文档。但一旦已缓存副本停留时间太长,超过了文档的新鲜度限制,就认为文档对象“过时”了,在提供该文档前,缓存需要再次与服务器进行确认,以查看文档是否发生了变化。
副本保留多长时间是新鲜的,由服务端Cache-Control
指定。Cache-Control
是一个通用首部字段,请求和响应报文都可以使用,客户端也可以强制缓存进行再验证,或者完全避免验证。
创建响应
缓存将已缓存的服务器响应首部作为响应首部的起点,然后缓存对这些基础首部进行修改和扩充。缓存会用新的首部和已缓存的主体来构建一条响应报文。
发送
缓存通过网络将响应发回给客户端。
日志
缓存可选地创建一个日志文件条目来描述这个事务。
Cache-Control
Cache-Control
是一个通用首部字段,请求和响应报文都可以对其进行配置,从而操作缓存的工作机制。指令的参数是可选的,多个指令之间通过“,”分隔。
缓存请求指令
- 其他缓存相关指令(条件请求,只有当条件为真时,才会执行请求):
if-match
:字段值和实体标记(ETag)匹配一致时,为trueif-modified-since
:字段值日期后修改过,为true,返回200 OK响应;字段值日期后资源没有过更新,返回状态码304 Not Modified响应。获取资源的更新日期,可通过首部字段Last-Modified
确认。if-none-match
:与if-match
作用相反。if-range
:搭配range
首部使用,如果if-range
的值和实体标记匹配一致,再匹配range
范围,返回206 Partial Content响应;如果if-range
匹配结果为假,则返回全部资源,响应为200 OK。if-unmodified-since
:与if-modified-since
作用相反。
缓存响应指令
服务器可以通过以上几种HTTP定义的方式来指定在文档过期之前可以将其缓存多长时间。按照优先级递减顺序,服务器可以:
Cache-Control:no-store
Cache-Control:no-cache
Cache-Control:must-revalidate
Cache-Control:max-age
Expires
:指定资源的失效日期
- 其他缓存相关指令:
Last-Modified
:指定资源最终修改的时间
作者:GOO74749
链接:https://juejin.im/post/6894175992315641869
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com