Skip to content

浏览器/缓存相关

🌌缓存协议(Cache-control)

什么是web缓存?

web缓存主要指的是两部分:浏览器缓存和http缓存。 浏览器缓存:比如,localStorage,sessionStorage,cookie等等。这些功能主要用于缓存一些必要的数据,比如用户信息。比如需要携带到后端的参数。亦或者是一些列表数据等等。 前端http缓存。

  • http缓存流程图 原理图

强制缓存

强制缓存,我们简称强缓存。 从强制缓存的角度触发,如果浏览器判断请求的目标资源有效命中强缓存,如果命中,则可以直接从内存中读取目标资源,无需与服务器做任何通讯。 强缓存是利用http头中的ExpiresCache-Control两个字段来控制的,Expireshttp1.0的规范,Cache-Control是在http1.1中出现的。 Cache-Control有一些常设置的值

  • private:仅浏览器可以缓存(默认值)
  • public:浏览器和代理服务器都可以缓存
  • max-age=xxx:过期时间单位秒
  • no-cache:不进行强缓存
  • no-store:不强缓存,也不协商缓存

协商缓存

EtagIf-None-Match

  • ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化。服务器根据浏览器上送的If-None-Match值来判断是否命中缓存。
  • 当服务器返回304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化。

Last-Modifyif-modified-since

  • 浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-ModifyLast-Modify是一个时间标识该资源的最后修改时间,例如Last-Modify: Thu,31 Dec 2037 23:59:59 GMT

  • 当浏览器再次请求该资源时,request的请求头中会包含 if-modified-since该值为缓存之前返回的Last-Modify。服务器收到if-modified-since后,根据资源的最后修改时间判断是否命中缓存。

  • 如果命中缓存,则返回304,并且不会返回资源内容,并且不会返回Last-Modify。 对于Etag和If-None-Match的实现,读取资源内容,转成hash值,然后跟Last-Modifyif-modified-since的实现差不多了,同一个道理。

推荐阅读

树字标品MES 让智造简单些!