HTTP缓存

106 阅读4分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

HTTP缓存

请求/响应缓存起来有助于提升系统的性能,Web缓存 减少了延迟和网络传输量,减少资源获取需要的时间。由于链路漫长,网络时延不可控,浏览器使用HTTP获取成本较高。所以,将数据缓存起来,下次请求的时候尽可能的复用,

  • 减轻服务器负载
  • 提升系统性能

HTTP缓存有几种不同的类型,可以分为两个主要类别:私有缓存共享缓存

  • 共享缓存:存储多个用重复使用的请求/相应
  • 私有缓存:也叫专用缓存,只适用于单个用户
  • 不缓存过期资源:所有的请求都会直接到达服务器,由服务器来下载资源返回

不缓存过期资源

使用no-cache标头代表不缓存过期资源,所有请求直接到达服务器

no-cache属于Cache-Control通用标头

Cache-Control:no-cache

设置最长时间为0也可以实现不缓存的效果

Cache-Control:max-age=0

私有缓存

只用存储单个用户,可能在浏览器中看到了缓存,浏览器缓存包含服务器通过HTTP下载下来的所有文档。这个高速缓存用于使访问的文档可以进行前进/后退,保存操作而无需重新发送请求。

使用private来实现私有缓存,这与public的用法相反,缓存服务器值对特定的客户端进行,其他客户端发送过来的请求,缓存服务器则不会返回缓存

Cache-Control:private

共享缓存

共享缓存是一种用于存储要由多个用户重用的响应缓存。共享缓存一般使用public来表示,public属性只出现在客户端响应中,表示响应可以被任何缓存所缓存。

Cache-Control:public

缓存控制

HTTP/1.1中的Cache-Control常规标头字段用于执行缓存控制,使用此标头可通过其提供的各种指令缓存策略。

不缓存/缓存需要验证/私有和共享缓存

no-store才是真正意义上的不缓存,每次服务器接受到客户端的请求后,都会返回最新的资源给客户端

Cache-Control:no-store

缓存过期

缓存中有一个重要的指令就是max-age,这是别资源视为可用的最长时间,与Expires相反,此指令是相对于请求时间的。对于应用程序不会更改的文件,可用于主动缓存

Cache-Control:max-age=123123

缓存验证

must-revalidate表示缓存必须在使用之前验证过时资源的状态,并且不应使用过期的资源

Cache-Control:must-revalidate

什么是可用的数据

因为储存空间是有限的,所以缓存会定期进行清除,叫做缓存驱除(cache eviction)

服务器上的缓存也会定期进行更新,HTTP作为应用层协议,是一种客户 - 服务器模式,HTTP是无状态的协议,资源发生变化无法通知到客户端。因此服务器必须通过某种方式告诉客户端资源更改重新请求。服务器会提供过期时间这个概念,告诉客户端在此到期时间之前,资源时可用的。过期算法通常会将新资源优先于旧资源使用。

过期资源并不会被回收,当告诉缓存接收到过期资源时,会使用If-None-Match转发此请求,检查它是否仍然有效。有效,服务器端返回 304 Not Modified响应头并且没有任何响应体,从而节省带宽。

缓存验证

当达到缓存资源的有效期时,将对其进行验证或再次获取。仅当服务器提供了强验证器弱验证器时,才可以进行验证。

如果缓存的响应包含Cache-Control:must-revalidate标头,正常浏览下也会触发该事件

Etag

客户端可以在未来的请求白头中发出If-None-Match,以验证缓存的资源。

Last-Modified响应头可以作为弱验证器,只有一秒钟可以分辨的时间。

Last-Modified标头,则客户端可以发出If-Modified-Since请求标头来验证缓存资源。