缓存常用来缓存一些访问量大的但是修改频率很低或者是计算量开销大但是实时性要求不高的数据。Web开发中,除了服务端可以使用Memcache和Redis缓存一些数据外,也可以利用http协议官宣的方式来缓存一些静态文件,如html、css、图片和js文件等,因为这些静态文件修改的频率较低,可以让浏览器缓存起来,下次请求的时候直接复用本地的缓存即可。这样可以减少用户网络请求,加快页面响应速度。下面具体介绍http的几种缓存方式。
Cache-Control缓存
通过指定指令来实现缓存机制。客户端和服务端都设置这个请求头,控制缓存。它取值和含义见下表。
取值 | 含义 | 描述 |
no-store | 禁止缓存 | 缓存中不得存储任何关于客户端请求和服务端响应的内容。每次由客户端发起的请求都会下载完整的响应内容 |
no-cache | 强制确认缓存 | 每次有请求发出时,缓存会将此请求发到服务端,服务端则会验证请求中所描述的缓存是否过期 |
public | 公共缓存 | 该响应可以被任何中间人(比如代理、CDN等)缓存 |
private | 私有缓存 | 专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中 |
max-age | 缓存过期机制 | 表示资源能够被缓存的最大时间,单位为秒 |
must-revalidate | 缓存验证确认 | 一旦资源过期(比如已经超过max-age),在成功向源服务器验证之前,缓存不能用该资源响应后续请求 |
no-transform | 不得对资源进行转换或转变 | Content-Encoding、Content-Range、Content-Type等HTTP头不能由代理修改。例如一非透明代理对图像进行转换或压缩,以便节省缓存空间或者减少缓慢链路上的流量 |
only-if-cached | 强制使用缓存 | 表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝。 |
协商缓存
协商缓存分为两种
ETag和If-None-Match组合
Last-Modified和If-Modified-Since组合
这两种同时出现时,ETag优先级要高于Last-Modified方式。
Sever/Client | HEADER | 描述 |
Client | If-None-Match | 与ETag响应头搭配使用,协商缓存,表示上次请求该资源的标识 |
If-Modified-Since | 与Last-Modified响应头搭配使用,协商缓存,表示上次请求该资源的修改时间 | |
Server | ETag | 与If-None-Match请求头搭配使用,服务端资源特定版本的标识符 |
Last-Modified | 与If-Modified-Since请求头搭配使用,表示资源最近修改时间(GMT) |
http1.0时代缓存
http1.0时代有两个头可以用来设置缓存Pragma和Expires, 详细介绍见下表。
Sever/Client | HEADER | 描述 |
Client | Pragma(http1.0) | 一般“Pragma: no-cache”这样使用,与 Cache-Control: no-cache 效果一致 |
Server | Expires(http1.0) | Expires的值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。如果响应有Cache-Control:max-age,则会直接覆盖这字段 |