浏览器的缓存机制

前言

缓存机制

  1. 强制缓存优先于协商缓存进行,
  2. 若强制缓存(Expires 和 Cache-Control)生效则直接使用缓存,
  3. 若不生效则进行协商缓存(Last-Modified / If-Modified-Since 和 Etag / If-None-Match),协商缓存由服务器决定是否使用缓存
  4. 若协商缓存失效,那么代表该请求的缓存失效,返回 200,重新返回资源和缓存标识,再存入浏览器缓存中;
  5. 生效则返回 304,继续使用缓存

强缓存

强缓存:不会向服务器发送请求,直接从缓存中读取资源,可以通过HTTP Header实现:Expires
和Cache-Control。
+ Expires:缓存过期时间,用来指定资源到期的时间,是服务端的具体的时间点,结合Last-modified
使用,Expires是HTTP/1.0的产物,受限于本地时间,如果修改了本地时间,可能会造成缓存失效。

+ Cache-Control(http/1.1):和多个指令(private、no-store、no-cache)配合使用,实现资源缓存。

+ Expires和Cache-Control同时存在,Cache-Control优先级高于Expires。

协商缓存

协商缓存就是强缓存失效后,浏览器携带缓存表示向服务器发起请求,由服务器根据缓存表示决定
是否使用缓存的过程,主要有以下两种情况:
+ 协商缓存生效,返回304和Not Modified

+ 协商缓存失效,返回200和请求结果。

+ 协商缓存可以通过设置两种HTTP Header实现:Last-Modified和ETag。

+ ETag是服务器响应请求时,返回当前资源文件的一个唯一标识(有服务器生成),只要资源有变化
,ETag就会重新生成。

http 缓存?

  • 强制缓存

    • 强制缓存
    • 强制缓存过期后会去服务端重新请求
  • 协商缓存

    • 服务端缓存策略
    • 服务端判断客户端资源,是否和服务端资源一样
    • 一致则返回 304,否则返回 200 和最新的资源
    • 在 Response Headers 中,有两种:
      • Last-Modified 资源的最后修改时间
        • last_modified
      • Etag 资源的唯一标识
        • etag
    • 协商缓存
    • Last-Modified 和 Etag
      • 会优先使用 Etag
      • Last-Modified 只能精确到秒级
      • 如果资源被重复生成,而内容不变,则 Etag 更精确
  • 综述

    • http缓存

刷新操作对缓存的影响?

  • 正常操作:地址输入 url,跳转链接,前进后退等
    • 强制缓存有效,协商缓存有效
  • 手动刷新:F5,点击刷新按钮,右击菜单刷新
    • 强制缓存失效,协商缓存有效
  • 强制刷新:ctrl + F5
    • 强制缓存失效,协商缓存失效

评论