http 协议通常应用于分布式信息系统,所谓分布式信息系统,是指以计算机网络为基础,将系统的数据与功能分别布置在不同的地方,然后再通过网络将数据与功能连接的信息系统。由于系统需要处理大量的信息,所以我们可以通过使用响应缓存的方式来提高系统性能。
对于客户端来说,可以将一些不经常变动的信息缓存到本地,在需要时客户端可以直接拿来使用,不必再向服务端发送请求;对于服务器来说,当客户端不能确定缓存是否有效(未过期)时,就需要再次向服务器发送请求,若缓存还可以使用,那么服务器就不必返回完整的响应,只需要返回响应行和响应头即可,减轻了服务器的压力。
客户端和服务器可以通过设置 cache-control 头字段来对请求和响应的缓存进行设置,http 协议中为我们预先定义好了许多用来设置缓存的指令(缓存指令),使用这些指令可以覆盖客户端默认的缓存算法,而且多个缓存指令可以组合使用,只需要在每个指令之间使用逗号将其分隔开即可,例如:
cache-control: max-age = 60, max-stale
客户端请求中可以使用的缓存指令如下表所示:
缓存指令 | 指令描述 |
---|---|
no-cache | 不进行缓存 |
no-store | 不能在本地缓存任何有关客户端请求或服务器响应的内容 |
max-age = seconds | 设置缓存的生命周期(seconds),单位为秒,在生命周期内可以使用该缓存 |
max-stale [ = seconds ] | 告诉客户端可以使用超过缓存时间 max-age 的缓存,seconds 用来设置可以超过的时间,单位为秒,如果省略则不限制超过的时间 |
min-fresh = seconds | 要求缓存服务器返回至少还未超过指定时间(seconds)的缓存资源 |
no-transform | 不论是在请求还是响应中,都不能改变请求体或响应体的媒体类型 |
only-if-cached | 当缓存存在时,不验证缓存是否失效或过期,完全使用缓存中的内容 |
服务器响应中可以使用的缓存指令如下表所示:
缓存指令 | 指令说明 |
---|---|
public | 响应可以被任何缓存区缓存 |
private | 响应的消息是针对单个用户的,不能当作共享缓存处理 |
no-cache | 不进行缓存 |
no-store | 不能在本地缓存任何有关客户端请求或服务器响应的内容 |
no-transform | 不论是在请求还是响应中,都不能改变请求体或响应体的媒体类型 |
must-revalidate | 可以进行缓存,但缓存在使用之前必须先经过服务器验证缓存的有效性 |
proxy-revalidate | proxy-revalidate 指令与 must-revalidate 指令的含义相同,不同之处在于 proxy-revalidate 指令仅适用于共享缓存 |
max-age = seconds | 设置缓存的生命周期(seconds),单位为秒,在生命周期内可以使用该缓存 |
s-maxage = seconds | 设置共享缓存的最大生命周期(seconds),单位为秒。s-maxage 指令会覆盖 max-age 指令。与之对应的私有缓存会忽略 s-maxage 指令 |
提示,这里的共享缓存也可以理解为是公有缓存,它里面不包含针对某个用户的数据,所以可以供所有用户使用;私有缓存则正好相反,只能针对某个用户。