一 :Http缓存:当客户端请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。
二:缓存的好处:减少了冗余的数据传输,减少了服务器的负担,加快了客户端响应的速度。
三:服务端Header 取值
Expires:后面跟一个绝对时间字符串,表示过期时间。
Cache-Control:除了提供了同Expires相同并更精确的缓存功能,还提供了验证机制,它可以取以下这些值:
max-age:功能和Expires类似,但是后面跟一个以“秒”为单位的相对时间,来供浏览器计算过期时间。
no-cache:提供了过期验证机制。
no-store:表示当前请求资源禁用缓存。
private:指示只有用户客户端可以缓存,而 CDN 等不可。
public:指示用户客户端和 CDN 都可以缓存当前资源。
四:直接缓存
当 response header中设置了Expires: {date_string}或者Cache-Control: max-age={secs}时,客户端会缓存所请求结果,如果下次相同的请求时间没有超过缓存过期时间,浏览器会直接从缓存中读取请求资结果,而不会向浏览器发送请求。
五:no-cache 验证
如果设置了Cache-Control: no-cache,那么客户端会在下次请求相同资源时,还是会向 server 发送请求,并带上相关验证 Header 字段,供 server 判断资源是否过期,并由服务器决定是返回该资源新的内容(状态码200,已过期),或是返回资源未修改的标识给客户端使其从缓存中读?。ㄗ刺?04,Not Modified)。
Cache-Control的优先级要高于Expires
六:服务器通过2种方式来判断浏览器缓存是否是最新的.
(1)客户端把缓存文件的最后修改时间通过 header ”If-Modified-Since“来告诉服务器。Last-Modified / If-Modified-Since
(2)客户端把缓存文件的ETag, 通过header "If-None-Match", 来告诉Web服务器。ETag / If-None-Match
七:ETAG的出现时为了解决Last-Modified/If-Modified-Since的弊端:server 来根据文件内容来生成一个唯一的 hash 值(md5等),截取一部分作为 Header 中 ETag 的值返回。
(1)某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。该验证方式的优先级要高于时间戳的验证方式。
八:判断缓存新鲜的流程
客户端想请求一个文档,会先去缓存中查找,如果缓存中存在这个文档,会把文档的最后修改时间通过header的“If-Modified-Since”发送给服务器,服务器收到请求后,会把服务器文档的Last-Modified和If-Modified-Since做比较,如果相同,则说明缓存有效(返回304 NOT-Modified),客户端就会去缓存里面取文档,如果不相等的话,就说明文档已经被更新了,服务器应该发送该文档的最新版本给客户端(200)。