2023-03-02 11:12:31
什么是缓存
对请求过的文件进行存储,方便重复使用,降低服务器压力,提高访问速度
HTTP 缓存需要解决以下问题:
- 哪些资源需要加入到缓存中
- 缓存的周期是多久
- 资源更新后,如何更新缓存
- 缓存过期但服务器资源未变动时如何处理
缓存规则
强缓存
再次请求时无需向服务器发送请求。
相关的 Response Headers:
- Expires
Expires: Mon, 25 Oct 2023 20:11:12 GMT - Cache-Control
no-cache:每次请求需要校验服务器资源的新鲜度max-age=3153600:浏览器在一年内都不需要向服务器请求资源
协商缓存
再次请求时需要向服务器校验资源的新鲜度。如果资源是新鲜的,服务器返回 304 状态码,浏览器继续使用本地缓存。
相关的 Headers:
- Last-Modified / If-Modified-Since
- 响应头的
Last-Modified和请求头的If-Modified-Since进行比对
- 响应头的
- ETag / If-None-Match
- 响应头的
ETag和请求头的If-None-Match进行比对
- 响应头的
启发式缓存
当资源没有配置 Cache-Control 或 Expires 强缓存响应头时,客户端会根据以下两个响应头来计算合适的强缓存时间,这种策略被称为启发式缓存:
- Date:资源在源服务器的产生时间
- Last-Modified:服务器上资源修改的最后时间
例如,资源生成时间是 2021/02/22,最近一次修改时间是 2022/02/22,时间差为一年。客户端会采用 Last-Modified 值的 10% 作为缓存时间,即 0.1 年。
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
Last-Modified: Tue, 22 Feb 2021 22:22:22 GMT
<!doctype html>
...
Cache-Control
作为响应头
用来控制缓存策略。
作为请求头
Cache-Control: no-cache:表示即使客户端拥有未过期的缓存,也要向服务器请求获取最新的资源Cache-Control: max-age=0:会验证服务器资源的新鲜度,如果缓存未过期则使用缓存并返回 304 状态码,否则重新获取资源并返回 200 状态码