赞
踩
不知道为何,先从缓存记起吧...
何为缓存,就是客户端或者代理服务器把响应保存下来,让以后浏览器访问相同URI的时候可以更快速的拿到响应,减少网络的带宽,用客户端来缓存响应叫做私有缓存,那用代理服务器来缓存响应就叫做共享缓存。那既然是一个缓存备份,那就意味这这个东西会过期,那如何保证我们从缓存拿到的响应和从源服务器上拿到的是一样的,下面细细道来:
首先,看看下面的计算缓存新鲜度的公式:
根据缓存的响应的cache-control头部的取值,或expires头部的取值,我们可以知道缓存的过期时间是什么时候,那光有过期时间不行啊,还得知道现在的时间嘛,你可能会说,现在时间看看表不就知道了吗,那我只能说你说对了!响应头current_age是需要经过一系列计算的出来的,如下图:
current_age是修正后的给我们看的时间,实际上,如果缓存是存储在代理服务器上的,我们只需要根据响应头中的age字段值就可以判断返回的响应是否还是新鲜的,age字段反应的是从源服务器发出响应到缓存此响应的代理服务器发出响应之间的时间,说白了就是我们从代理服务器拿到的这个响应在代理服务器上大概存在了多久了,注意这里是大概,因为还差了源服务器到代理服务器之间响应报文传输的网络时延。
过期时间的取值有四种,先来看看较为复杂的头部cache-control的取值,cache-control既能作为请求头字段又能作为响应头字段,具体细节见下面的图:
话题回到计算缓存新鲜度的公式中,为什么过期时间中还需要一种预估过期时间的方式来定义freshness_lifetime呢,原因是很多源服务器发送的HTTP响应报文中,都未以其它三种方式指明缓存的过期时间,这时候如果浏览器或代理服务器又想缓存响应,怎么办呢,只能通过这种预估过期时间的方式,常用的预估值如下:
那什么样的响应可以被缓存呢?或者说什么时候可以用缓存机制呢?或者说怎么用呢?
1)请求方法可以被缓存理解(如GET)
2)响应码可以被缓存理解(如404、206等都可以)
3)请求或响应中都没有Cache-Control: no-store头部
4)响应中含有指明过期时间的头部或补充响应码(如Expires头部,Cache-Control: max-age,Cache-Control: s-maxage或Warning: 113 - "Heuristic Expiration")。
5)如果是代理服务器想要使用缓存,响应中不能含有Cache-Control: pravite头部或Authorization头部。
总结一下吧,这次主要要记住的是缓存的工作原理以及使用缓存时涉及的HTTP报文头部:
cache-control: s-maxage=3600,(缓存过期相对时间,仅针对共享缓存)
cache-control: max-age=3600, (缓存过期相对时间,age超过此值后则缓存过期)
expires: Sat, 06 Dec 2031 12:13:15 GMT (缓存过期绝对时间)
age: 3600 (从源服务器发出响应到从代理服务器或浏览器缓存发出这个响应经历的时间)
current-age: 3600 (修正后的age)
date: Wed, 08 Dec 2021 12:13:16 GMT (源服务器发出此响应的时间)
vary: Accept-Encoding (缓存的响应中的vary头部指定的头部一定要与请求中的相匹配)
etag: W/"619707aa-7677" (缓存的响应在服务器中的指纹,用于缓存过期的时候向服务器确认缓存是否还可继续使用)
last-modified: Fri, 19 Nov 2021 02:10:50 GMT (响应相关的URI在源服务器中的最后修改时间)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。