用户登录
用户注册

分享至

HTTP缓存机制(Cache-Control)

  • 作者: 联合国灭猫灭狗小组长
  • 来源: 51数据库
  • 2022-09-23

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-revalidateproxy-revalidate 指令与 must-revalidate 指令的含义相同,不同之处在于 proxy-revalidate 指令仅适用于共享缓存
max-age = seconds设置缓存的生命周期(seconds),单位为秒,在生命周期内可以使用该缓存
s-maxage = seconds设置共享缓存的最大生命周期(seconds),单位为秒。s-maxage 指令会覆盖 max-age 指令。与之对应的私有缓存会忽略 s-maxage 指令

提示,这里的共享缓存也可以理解为是公有缓存,它里面不包含针对某个用户的数据,所以可以供所有用户使用;私有缓存则正好相反,只能针对某个用户。


软件
前端设计
程序设计
Java相关