关于http缓存:ServiceWorker-缓存与-HTTP-缓存

尽管 ServiceWorker 和 PWA 正在成为古代 Web 应用程序的规范,但浏览器资源缓存变得比以往任何时候都简单。 本文涵盖了浏览器缓存的重点内容,具体包含: ServiceWorker 缓存与 HTTP 缓存的优先级?支流浏览器实现的 MemoryCache 和 DiskCache 在哪一层?MemoryCache、DiskCache、ServiceWorker 缓存哪个速度更快?缓存流程概述咱们先来看规范定义的资源申请遵循的程序: ServiceWorker 缓存:ServiceWorker 查看资源是否存在其缓存中,并依据其编程的缓存策略决定是否返回资源。这个操作不会主动产生,须要在注册的 ServiceWorker 中定义 fetch 事件去拦挡并解决网络申请,这样能力命中 ServiceWorker 缓存而不是网络或者 HTTP 缓存。HTTP 缓存:这里就是咱们经常说的「强缓存」和「协商缓存」,如果 HTTP 缓存未过期的话,浏览器就会应用 HTTP 缓存的资源。服务器端:如果 ServiceWorker 缓存或者 HTTP 缓存中未找到任何资源,则浏览器会向网络申请资源。这里就会波及到 CDN 服务或者源服务的工作了。这是规范定义的资源申请流程,然而有谋求的浏览器还会在 ServiceWorker 下面加一层 「内存缓存层」 ,以 Chrome 为例,咱们申请一个资源,除去网络,会有三种浏览器缓存返回: 那么 MemoryCache 和 DiskCache 与 ServiceWorker Cache 的优先级是怎么样的呢? 上面咱们讲讲三者的区别。 MemoryCache、DiskCache 在缓存流程的哪一层?咱们以 Chrome 为例,MemoryCache 作为第一公民,位于 ServiceWorker 之上。 也就是命中了 MemoryCache,就不会触发 ServiceWorker 的 fetch 事件。 而 DiskCache 则位于原来的 HTTP 缓存层: ...

April 21, 2022 · 2 min · jiezi

关于http缓存:爪哇学习笔记HTTP缓存

什么是缓存?缓存是一种保留资源正本并在下次申请时间接应用该正本的技术。当 web 缓存发现申请的资源曾经被存储,它会拦挡申请,返回该资源的拷贝,而不会去源服务器从新下载。缓存的作用缓解服务器端压力,晋升性能(获取资源的耗时更短了)。缓存分类公有缓存公有缓存只能用于独自用户。浏览器缓存共享(共有)缓存共享缓存能够被多个用户应用。代理缓存网关缓存CDN反向代理缓存缓存命中和缓存未命中能够用已有的正本为某些达到缓存的申请提供服务,这被称为缓存命中(cache hit)。其余一些达到缓存的申请可能会因为没有正本可用,而被转发给原始服务器,这被称为缓存未命中(cache miss)。 再验证原始服务器的内容可能会发生变化,缓存要不断对其进行检测,看看它们保留的正本是否仍是服务器上最新的正本。这些“新鲜度检测”被称为HTTP再验证。 缓存对缓存的正本进行再验证时,会向原始服务器发送一个小的再验证申请。如果内容没有变动,服务器会一个小的304 Not Modified进行响应。只有缓存晓得正本依然无效,就会再次将正本标识为临时陈腐的,并将正本提供给客户端。这被称作再验证命中或迟缓命中。因为要与服务器进行核查,所以这种形式比缓存命中要慢,然而它没有从服务器获取对象数据,所以比缓存未命中要快一些。 最罕用的再验证工具If-Modified-Since首部再验证命中如果服务器对象未被批改,服务器会向客户端发送一个小的HTTP 304 Not Modified响应。再验证未命中。如果服务器对象已与缓存正本不同,服务器向客户端发送一条一般的、带有残缺内容的HTTP 200 OK响应。对象被删除如果服务器对象曾经被删除了,服务器就会回送一个404 Not Found响应,缓存也会将其正本删除。辨别命中和未命中的状况HTTP没有为用户提供一种伎俩来辨别响应是缓存命中的,还是拜访原始服务器失去的。在这两种状况下,响应码都是200 OK,阐明响应有主题局部。 客户端有一种办法能够判断响应是否来自缓存,就是应用Date首部(将Date首部的值与以后工夫进行比照)。客户端也能够通过Age首部来检测缓存的响应,通过这个首部能够分辨出这条响应的使用期。 缓存的解决步骤对一条HTTP GET报文的根本缓存处理过程包含7个步骤: 接管——缓存从网络中读取到达的申请报文。解析——缓存对报文进行解析,提取出URL和各种首部。查问——缓存查看是否有本地正本可用,如果没有,就获取一份正本并将其保留在本地新鲜度检测——缓存查看已缓存的正本是否够陈腐,如果不是,就询问服务器是否有任何更新创立响应——缓存会用新的首部和已缓存的主体来构建一条响应报文发送——缓存通过网络将响应发回给客户端日志——写日志记录放弃正本的陈腐HTTP有一些简略的机制能够在不要求服务器记住有哪些缓存领有其正本的状况下,放弃已缓存数据与服务器数据之间充沛统一。HTTP将这些简略的机制称为文档过期和服务器再验证。 文档过期通过非凡的HTTP Cache-Control首部和Expires首部,HTTP让原始服务器向每个文档附加了一个“过期日期”。 在缓存文档过期之前,缓存能够以任意频率应用这些正本,而无需与服务器分割——当然,除非客户端申请中蕴含有阻止提供已缓存或未验证资源的首部。但一旦已缓存文档过期,缓存就必须与服务器进行核查,询问文档是否被批改过,如果被批改过,就要获取一份陈腐的正本。 过期日期和使用期服务器用HTTP/1.0+的Expires首部或HTTP/1.1的Cache-Control: max-age响应首部来指定过期日期,同时还会带有响应主体。 Cache-Control: max-agemax-age值定义了文档的最大使用期——从第一次生成文档到文档不再陈腐、无奈应用为止,最大的非法生存工夫(以秒为单位)Expires指定一个相对日期。如果过期日曾经过了,就阐明文档不再陈腐了服务器再验证仅仅是缓存文档过期了并不意味着它和原始服务器上目前处于沉闷状态的文档有理论的区别,这只意味着到了要进行核查的工夫了。这种状况被称为“服务器再验证”,阐明缓存须要询问原始服务器是否产生了变动。 如果产生了变动,缓存会获取一份新的文档正本,并将其存储在旧文档的地位上,而后将文档发送给客户端。如果没有发生变化,缓存只须要获取新的首部,包含一个新的过期日期,并对缓存中的首部进行更新就好了。用条件办法进行再验证HTTP容许缓存向服务器发送一个“条件GET”,申请服务器只有在文档与缓存中现有正本不同时,才会回送对象主体。通过这种形式,将新鲜度检测和对象获取联合成了单个条件GET。向GET申请报文中增加一些非凡的条件首部,就能够发动条件GET。只有条件为真时,Web服务器才会返回对象。 HTTP定义了5个条件首部。对缓存再验证来说最有用的2个首部是If-Modified-Since和If-None-Match。 If-Modified-Since:<date>如果从指定日期之后文档被批改了,就执行申请的办法。能够与Last-Modified服务器响应首部配合应用If-Modified-Since: <cached last-modified date>,只有在内容被批改后与已缓存版本有所不同的时候才去获取内容If-None-Match:<tags>服务器能够为文档提供非凡的标签(ETag),而不是将其与最近批改日期相匹配,这些标签就像序列号一样。如果已缓存标签与服务器文档中的标签有所不同,If-None-Match首部就会执行所申请的办法强弱验证器实体标签和最近批改日期都是缓存验证器。 有时候,服务器心愿在对文档进行一些非实质性或不重要的批改时,不要使所有已缓存正本都生效。HTTP/1.1反对弱验证器,如果只是对内容进行了大量批改,就容许服务器申明那是“足够好”的等价体。 只有内容产生了变动,强验证器就会变动。弱验证器容许对一些内容进行批改,但内容的次要含意发生变化时,通常它还是会变动的。 什么时候应该应用实体标签和最近批改日期如果服务器回送了实体标签,HTTP/1.1客户端就必须应用实体标签验证器如果服务器只回送了一个Last Modified值,客户端就能够应用If-Modified-Since验证如果实体标签和最初批改日期都提供了,客户端就应该应用这两种再验证计划,这样HTTP/1.0和HTTP/1.1缓存就都能够正确响应了如果HTTP/1.1缓存或服务器收到的申请既带有If-Modified-Since,又带有实体标签条件首部,那么只有这两个条件同时满足时,能力返回304 Not Modified响应管制缓存的能力no-store与no-cache响应首部Pragma: no-cacheCache-Control: no-storeCache-Contorl: no-cache标识为no-store的响应会禁止缓存对响应进行复制(即不容许将响应主体对象存到缓存中区)。标识为no-cache的响应实际上是能够存储在本地缓存区中的。只是在与原始服务器进行新鲜度再验证之前,缓存不能将其提供给客户端应用。HTTP/1.1中提供Pragma: no-cache首部是为了兼容于HTTP/1.0+。除了与只了解Pragma: no-cache的HTTP/1.0应用程序进行交互时,HTTP/1.1应用程序都应该应用Cache-Contorl: no-cache。 max-age响应首部Cache-Contorl: max-age首部示意的是从服务器将文档传来之时起,能够认为此文档处于陈腐状态的秒数。还有一个s-maxage首部,其行为与max-age相似,但仅实用于共享缓存: Cache-Control: max-age=3600Cache-Control: s-maxage=3600服务器能够申请缓存不要缓存文档,或者将最大使用期设置为零,从而在每次拜访的时候都进行刷新: Cache-Control: max-age=0Cache-Control: s-maxage=0Expires响应首部不举荐应用Expires首部,它指定的是理论的过期日期而不是秒数。 expires: Wed, 09 Feb 2022 05:41:19 GMT有些服务器还会回送一个expires: 0响应首部,试图将文档置于永远过期的状态,但这种语法是非法的,可能给某些软件带来问题。 must-revalidate响应首部能够配置缓存,使其提供一些古老(过期)的对象,以进步性能。如果原始服务器心愿缓存严格遵守过期信息,能够在原始响应中附加一个Cache-Control: must-revalidate首部。 Cache-Control: must-revalidatemax-stale响应首部Cache-Control: max-staleCache-Control: max-stale=<s>缓存能够随便提供过期的文件。如果指定了<s>参数,在这段时间内,文档就不能过期。这条指令放松了缓存的规定。 ...

January 15, 2022 · 1 min · jiezi

关于http缓存:HTTP缓存

什么是HTTP缓存当客户端向服务器发送申请时,先到达浏览器获取缓存数据。 缓存个别从第二次申请开始,且只能缓存get申请响应的资源。 HTTP缓存分为强缓存和协商缓存 强缓存Cache-Control : max-age 设置缓存存在工夫,优先级比Expires高 Expires: 绝对工夫 可能客户端和服务器之间会有误差 协商缓存Cache-Control : no-cache 设置协商缓存 不缓存Cache-Control : no-store 不缓存 pragma 只有一个选项no-cacha,告诉浏览器不实用缓存,并且优先级最高

May 19, 2021 · 1 min · jiezi