浏览器缓存策略(强缓存)

198 阅读4分钟

浏览器缓存策略

为什么要用浏览器缓存

浏览器和服务器进行交互的过程, 时间开销的瓶颈往往出现在数据的传输的过程之中。

如果相同的数据被重复请求了不止一次,那么多余的请求次数必然会浪费网络带宽,以及延迟浏览器渲染所要处理的内容,从而影响用户的使用体验。

因此考虑使用缓存技术对已获取的资源进行重用,是一种提升网站性能与用户体验的有效策略。

缓存原理

缓存的原理是首次请求后保存一份请求资源的响应副本,当用户再次发起相同请求后,如果判断缓存命中则拦截请求,将之前存储的响应副本返回给用户,从而避免重新向服务器发起资源请求。

缓存的使用

一般用于静态资源的保存提高网页性能。静态资源有一定时间的不变性所以适合资源缓存

浏览器请求流程(强缓存与协商缓存共同使用)

缓存流程图.webp

强缓存

  • 如果浏览器判断所请求的目标资源有效命中,则可以直接从强制缓存中返回请求响应和 Status Code 200 OK,无须与服务器进行任何通信。
  • 强缓存是利用 http 头中的 ExpiresCache-Control 两个字段来控制的,用来表示资源的缓存时间。
Expires

介绍:Expires 是在 HTTP1.0 协议中声明用来控制缓存失效日期的时间戳的字段,它由服务器端指定后通过响应头告知浏览器,浏览器在接收到带有该字段的响应体后进行缓存。 它的值是一个绝对时间的 GMT 格式的时间字符串与 Date 格式相同。

    expires:Mon, 09 May 2023 10:47:02 GMTDate: Mon, 09 May 2023 02:54:38 GMT
  • 浏览器再次发起相同的资源请求,便会对比 expires 与本地当前的时间戳,如果当前请求的本地时间戳小于 expires 的值,则说明浏览器缓存的响应还未过期,可以直接使用无须向服务器再次发起请求。只有当本地时间戳大于 expires 值发生缓存过期时,才允许向服务器重新发起请求。
  • 缺陷: 电脑本地时间是可以被修改的。这样会触发永远不会过期
Cache-Control :max-age|s-maxage|no-cache|no-store|private|public

介绍: http 1.1 协议中添加了 Cache-Control 中的 max-age, 他是一个相对值, 单位为 S(秒),代表多久过期。

   //360S后资源过期
   Cache-Control:max-age=360
  • no-cache 与 no-store 互斥

  • public 与 private 互斥

    1. max-age 服务器端告知客户端浏览器响应资源的过期时长(常用)
    2. s-maxage s-maxage 表示缓存在代理服务器中的过期时长,当且仅当设置了 public 属性值时才有效。
    3. no-cache 设置 no-cache 表示跳过强缓存判断,强制进行协商缓存,若缓存未过期,则会使用本地缓存。
    4. no-store 设置 no-store 则表示禁止使用任何缓存策略,客户端的每次请求都需要服务器给予响应,获取资源。
    5. public 若资源响应头中的 cache-control 字段设置了 public 属性值,则表示响应资源既可以被浏览器缓存,又可以被代理服务器缓存
    6. private private 则限制了响应资源只能被浏览器缓存。
  • 注意,Expires 是 http1.0 的产物, Cache-Control 则是 http1.1 的产物。 两者同时存在, 或者只存在其中之一, 都可以触发强制缓存

  • Cache-Control 比 Expires 优先级高

  • 当满足字段约束的情况下, 浏览器就不会向服务器发送请求而是直接从服务器返回数据, 同时其状态码为 200

强制缓存主要取决于两个字段 Expires 和 Cache-Control 中的 max-age 字段, 在两个响应头都存在的情况下, 其流程如图所示

强缓存流程图.png

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1天,点击查看活动详情