透明多级缓存技术-客户端/前端缓存技术
强制缓存
Expires
HTTP 1.1之前使用该Header控制资源有效时间
- 作用
服务器承诺在指定的时间之前特定资源不会过期或者更新
示例如下:
HTTP/1.1 200 OK
Expires: Wed, 8 Apr 2020 07:28:00 GMT
-
使用场景
某些更新频率较慢的资源可以使用该Header来控制其过期时间- 图书信息接口-特定图书的信息在后端不会频繁更新
- 特定商品的SKU信息接口-出某些活动大促期间,商品的SKU信息更新频率较慢
-
缺陷
- 若恶意修改客户端本地时间会导致超期持有或者提前过期的问题
- 资源的私有性无法控制
- 未定义"不缓存"相关语法
Cache-Control
Cache-Control是HTTP/1.1协议中的强制缓存Header,语义比Expires更为丰富,并且若Cache-Control与Expires都有定义时,以Cache-Control的定义为准。
max-ages
- 作用
max-age后面跟随一个以秒为单位相对时间(相对与请求时间),在请求时间-请求时间+max-age时间段内缓存有效,该时间段内客户端无需重新从服务器中获取资源。
示例如下:
HTTP/1.1 200 OK
Cache-Control: max-age=600
s-maxage
s即share的意思,即共享缓存的过期时间控制
- 作用
作用与max-age类似,只不过该字段控制的对象是CDN\代理等节点的缓存行为
public
- 作用
public用于指示该资源可以被CDN,代理节点所缓存
private
- 作用
private用于指示该资源不可被CDN,代理节点所缓存
no-store
禁止浏览器、CDN、代理节点持久化相关资源
- 作用
保护部分私密资源,如临时用户信息
no-cache
指示浏览器不需缓存相关资源,每次请求都重服务器获取最新的资源
- 作用
对于更新频率较快的资源,需要每次从服务器请求最新的资源
no-transform
指示中间链路节点无需对资源进行gzip或者编码、解码、加密、解密等操作
must-revalidate
用于指示资源过期后(超出max-age时间后),浏览器必须从服务器获取资源
proxy-revalidate
用于指示资源过期后(超出max-age时间后),CND\代理节点必须从服务器获取资源。
协商缓存
强制缓存是基于时效性的,但无论是人还是服务器,其实多数情况下并没100%把握去承诺某项资源固定时间内不会发生变化。另外一种基于变化检测的缓存机制,在一致性上会有比强制缓存更好的表现,但需要一次变化检测的交互开销,性能上就会略差一些,这种基于检测的缓存机制,通常被称为“协商缓存”
Last-Modified
该Header是服务端返回的特定资源的最后修改时间
HTTP/1.1 304 Not Modified
Cache-Control: public, max-age=600
Last-Modified: Wed, 8 Apr 2020 15:31:30 GMT
If-Modified-Since
该Header是客户端在Header中添加的,即将上一次收到的Last-Modified时间填入,服务器收到该Header后,如果发现资源在这个时间之后没有改动,则直接发送304/Not Modified的响应,无须附带消息体,实现省流的效果.
否则有改动则需发送最新的资源给客户端,如下
HTTP/1.1 200 OK
Cache-Control: public, max-age=600
Last-Modified: Wed, 8 Apr 2020 15:31:30 GMT
Response Content
Etag(…)
ETag是服务端的响应Header,用于告诉客户端这个资源的唯一标识
举例:Apache服务端的ETag值默认是对文件的索引节点(INode)、大小和最后修改时间进行哈希计算后得到
-
作用
-
使用场景
对于数据一致性要求强的场景,如高级别的身份认证系统就需基于ETAG来保证每个身份的实时可靠性。 -
缺陷
- 该Header对性能有一定的影响,无论是生成hash还是hash对比都需要消耗一定的时间