Vary头部由服务器端添加到响应头部,在缓存中读取到该响应时,会读取到相应的头部,进行一些针对缓存的判断。针对相同的请求,不同的的编码模式会需要返回不同的返回数据。因此如果要从缓存中获取数据时需要缓存多个副本数据,以满足不同的不同的格式,需要Vary头部来解决这个问题。
1. Vary头部的格式
Vary头部一般出现在HTTP请求的响应头部,格式为:Vary:Accept-Encoding,User-Agent或者Vary:Accept-Encoding。
Accept-Encoding表示客户端支持的编码格式,可以配置多个编码格式。服务器端会根据请求端的Accept-Encoding对返回的内容进行编码,并通过响应头说明最终使用的编码格式。User-Agent表示客户端代理,表示了客户端的各项信息,便于服务端针对不同要求的数据类型的返回操作。
2. 使用场景
在请求能够缓存命中的时候,针对同一请求,缓存中分别存储了A,B两种格式的数据,很有可能导致只返回一种格式的数据。这就会让数据的展示出现问题。比如某个客户端支持压缩gzip,另外一个客户端不支持压缩。如果返回同一格式的数据,就会导致返回错误的数据,出现故障。
Vary头部可以解决这个问题。Vary头部的信息从客户端请求头中的获取,并存储在缓存中。如果有请求命中缓存的话,通过请求头中的信息和缓存中的Vary头中信息比对,返回正确的缓存副本,返回正确的响应。
3.刷新场景特殊处理
针对部分刷新场景,刷新请求需要删除所有的缓存副本,但由于缓存key的不同无法做到。对于这类场景,需要对多副本缓存的部分特殊处理,查询到缓存的所有多副本再构造缓存key删除。