Http Cache

HTTP缓存是web应用程序中提高性能和减少资源浪费的机制,它可以让浏览器缓存已经访问过的资源,以便以后访问时可以从缓存中
加载,而不需要重新下载。

强缓存与协商缓存

强缓存 (Expires / Cache-control )

强缓存是一种HTTP缓存机制,它使浏览器可以缓存资源,并在下一次请求时直接从缓存中加载资源,而不需要向服务器发送请求。浏览器通过检查响应头中的Expires和Cache-Control字段来判断缓存是否过期。如果缓存没有过期,则使用缓存中的资源,否则会向服务器发送请求以获取新的资源

  • Expires(http1.0)如果改了电脑本地时间 那么可能会出现误差
  • Cache-control(http1.1) 优先级更高
    • Public: 资源设置了 public,那么它既可以被浏览器缓存,也可以被代理服务器缓存
    • Private: 默认值 只能被浏览器缓存
    • no-store: 不使用任何缓存 每次都得向服务起发起请求
    • no-cache: 请求头设置则告诉浏览器不应该使用浏览器缓存 每次请求都从服务器获取最新的相应 响应头设置 表示浏览器不应该缓存相应

协商缓存 (Last-Modified / Etag)

协商缓存是另一种HTTP缓存机制,它在缓存资源过期时使用,它允许服务器和客户端之间进行通信,以确定是否需要重新下载资源。当浏览器向服务器发送请求时,服务器可以在响应头中添加Etag或Last-Modified字段来标识资源的标识符或最后修改时间。当浏览器再次请求该资源时,它会向服务器发送一个带有If-None-Match或If-Modified-Since的请求头,以检查资源是否发生了更改。如果资源没有更改,则服务器将返回304 Not Modified响应,浏览器将从缓存中加载资源,否则将返回新的资源

  • Last-Modified(http1.0)=> If-Modified-Since
    • 处理逻辑: 第一次请求资源的时候,响应头中会添加Last-Modified代表资源最后修改时间,当再次请求该资源时,浏览器会加上If-Modified-Since字段,值为Last-Modified的值,服务端判断,如果相等,说明资源未修改,返回304,否则返回新的Last-Modified.
    • 缺点:
      1. 短时间内修改资源,但是Last-Modified不会改变,如此返回304,其实并不是新的资源。
      2. 修改内容,之后又修改成之前的样子,我们认为资源是没有改变,但Last-Modified的值会改变,记录文件的最后修改时间,此时服务器判断Last-Modified不同,返回数据,重新给了新的Last-Modified值,实际上应该使用缓存。
  • Etag (http1.1) => If-None-Match(优先级高 类似于上面的Cache-control)
    • 处理逻辑: Etag一般是由文件内容生成的hash,代表资源的唯一性,当资源修改后,Etag会改变,当浏览器再次请求时添加If-no-match带上Etag的值,服务端判断是否使用缓存。

在实际开发中,我们可以通过设置响应头中的Cache-Control字段来控制缓存的行为,例如max-age指定缓存的最大有效期,no-cache指示缓存需要重新验证,no-store则完全禁止缓存。

http1.0 1.1 2.0及3的区别?

HTTP协议的版本有HTTP/1.0、HTTP/1.1和HTTP/2,这些版本之间的主要区别在于它们的性能和功能方面的不同。

  • HTTP/1.0仅支持传输文本和图像等静态内容,并需要建立多个TCP连接,导致网络延迟。
  • HTTP/1.1使用持久连接和管道化请求,允许多个请求和响应共享一个TCP连接,从而提高了性能。
  • HTTP/2使用二进制协议和多路复用,提高了解析速度和性能,并支持服务器推送,加速页面加载时间
  • HTTP/3是基于QUIC(Quick UDP Internet Connections)协议的,QUIC是一种基于UDP协议的传输协议,与TCP协议相比,具有更快的连接建立时间和更少的队头阻塞问题