对码当歌,猿生几何?

http缓存

缓存常用来缓存一些访问量大的但是修改频率很低或者是计算量开销大但是实时性要求不高的数据。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-EncodingContent-RangeContent-TypeHTTP头不能由代理修改。例如一非透明代理对图像进行转换或压缩,以便节省缓存空间或者减少缓慢链路上的流量

only-if-cached

强制使用缓存

表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝。

协商缓存

协商缓存分为两种  

  1. ETag和If-None-Match组合 

  2. 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,则会直接覆盖这字段