「开位」你所应该知道的HTTP——缓存篇

前言

接上篇,HTTP协议有关缓存的部份内容较多,须要重点详讲,故独立成一章。html

《你所应该知道的HTTP》系列相关文章:web

概述

HTTP协议的缓存是经过6个报文头完成的,经过两层协商使web资源可以不那么频繁地在服务器与客户端之间传递,从而节约了流量,提升浏览速度。
以从客户端到服务器的顺序,第一层协商为Cache-Control与Expires;第二层协商为Last-Modified与Etag。segmentfault

相关的报文头

Cache-Control

请求/响应报文头,缓存控制字段,也就是用于给资源生命期,是http/1.1引入的属性。
Cache-Control的取值可细分为两类,一类是对缓存有直接决定性的值,他们会致使后续的第二层协商被跳过,包括:no-store、public、private;另外一类是相似Expires的值,只是规定了有效期,后续的第二层协商不受影响,包括no-cache、max-age=x、s-maxage=x。浏览器

Cache-Control的取值以下:缓存

属性名 说明文字
no-store 不缓存该资源。
no-cache 缓存该资源,能够等价与max-age=0。
max-age=x 请求缓存后的x秒再也不发起请求。
s-maxage=x 代理服务器请求源站缓存后的x秒再也不发起请求,只对CDN缓存有效。
public 客户端和代理服务器(CDN)均可缓存。
private 只有客户端能够缓存。

形如:服务器

Cache-Control:max-age=0

Expires

响应报文头,表明资源过时时间,由服务器返回提供,是http1.0的属性,在与Cache-Control共存的状况下,优先级要低。
Expires的功能基本与Cache-Control的max-age类似,但它是指定一个过时时间点,而Cache-Control的max-age是指定了过时前的秒数。网络

形如:负载均衡

Expires:Fri, 10 Apr 2020 16:30:04 GMT

Last-Modified

响应报文头,资源最新修改时间,由服务器告诉浏览器。spa

形如:3d

Last-Modified:Mon, 23 Mar 2020 18:39:50 GMT

If-Modified-Since

请求报文头,与Last-Modified相对应,浏览器把服务器最后一次给的Last-Modified返回,服务器将以此进行对比,判断资源是否须要更新。

形如:

If-Modified-Since:Fri, 10 Apr 2020 14:45:24 GMT

Etag

响应报文头,资源内容惟一标识,由服务器告诉浏览器。

形如:

Etag:58b66ccbe349d0d931df877c00d8101d037243dc

If-None-Match

请求报文头,与Etag相对应,浏览器把服务器最后一次给的Etag返回,服务器将以此进行对比,判断资源是否须要更新。

形如:

If-None-Match:58b66ccbe349d0d931df877c00d8101d037243dc

协商流程

如下假定资源已经获取过一次,而且运行在HTTP/1.1环境下,如今进行二次访问。

流程图以下:
HTTP缓存.png

说明:

  • 客户端是有可能由于缓存缘由不向服务器发起任何请求的,图中200状态(from cache)就是这种状况。
  • 服务器根据回传的If-Modified-Since与Last-Modified比对,若是不一样则说明这个文件修改过,须要更新。但在这种判断精度是秒,若是是一秒内的改动,就须要进一步对比回传的If-None-Match与ETag的值。
  • 服务器返回304的意思就是不须要从新获取新资源,直接使用本地缓存便可。

缓存多久合适

生存时间(TTL)指令告诉浏览器应该缓存某个资源多久,即Cache-Control或Expires的值。
找到给定资源的最佳TTL值并无完美的科学方法,只能凭经验给出一些指导原则。

指导原则:

  • 纯静态内容,例如图片或带版本的数据,能够在客户端永久缓存;
  • CSS/JS和个性化资源,缓存时间大约是会话(交互)平均时间的两倍;
  • 其余类型资源取决于新数据对旧数据的容忍极限。

浏览器操做对HTTP缓存的影响

用户操做 Expires/Cache-Control Last-Modified/Etag
地址栏回车 有效 有效
页面连接跳转 有效 有效
新开窗口 有效 有效
前进、后退 有效 有效
F5刷新 无效 有效
Ctrl+F5刷新 无效 无效

缓存改进方案

  • md5/hash缓存:经过不缓存html,为静态文件添加MD5或者hash标识,解决浏览器没法跳过缓存过时时间主动感知文件变化的问题。
  • CDN缓存:CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,经过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,下降网络拥塞,提升用户访问响应速度和命中率。
相关文章
相关标签/搜索