http缓存

1. 缓存的作用

  • 减少网络带宽消耗
  • 降低服务器压力
  • 减少网络延迟,加快页面打开速度

2. 缓存的分类

  1. 代理缓存
  2. 浏览器缓存
  3. 网关缓存
  4. 负载均衡

3. 浏览器缓存

1. 强制缓存

强缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,则重新发起请求。

Cache-control:

  1. 可缓存性:
  • public:浏览器和缓存服务器都可以缓存页面信息
  • private:默认值,代理服务器不可缓存,只能被浏览器缓存
  • no-cache:强制客户端每次请求都向服务器发送请求验证资源是否变更,是则返回新内容,否则返回304,未变更。 -only-if-cache:客户端只接受已缓存的响应
  1. 到期时间
  • max-age=:缓存存储的最大周期,超过这个周期被认为过期。
  • s-maxage=:代理服务器缓存时长(只有当max-age是public才会生效)。
  • max-stale=:客户端愿意接收一个已经过期的资源的时长(同时设置的话可以理解为max-age和max-stale的和)
  • stale-while-revalidate=:客户端愿意接收陈旧的响应,并且在后台一部检查新的响应。时间代表客户端愿意接收陈旧响应的时间长度。

  • stale-if-error=:如新的检测失败,客户端则愿意接收陈旧的响应,秒数值表示客户在初始到期后愿意接受陈旧响应的时间。
  1. 重新验证和重新加载
  • must-revalidate:如页面过期,则必须去服务器进行获取,不能使用过期资源。
  • proxy-revalidate:must-revalidate 作用相同,仅适用于共享缓存(例如代理),并被私有缓存忽略。
  • immutable:响应正文不随时间改变。资源(如果未过期)在服务器上不发生改变,因此客户端不应发送重新验证请求头(例如If-None-Match或 If-Modified-Since)来检查更新,即使用户显式地刷新页面。
  1. 其他
  • no-transform:不得对资源进行转换和转变。例如,不得对图像格式进行转换。
  • no-store:禁止一切缓存(这个才是响应不被缓存的意思)。
  • Expires: 它的值为服务端返回的数据到期时间时间,在该时间内,浏览器不再向服务器请求,而是读取缓存数据

expires是http1.0的属性,http1.1中Expires被Cache-Control替代,Cache-control 的优先级高于 Expires,为了兼容 HTTP/1.0 和 HTTP/1.1,实际项目中两个字段都可以设置。

2. 协商缓存

让客户端与服务器之间能实现缓存文件是否更新的验证、提升缓存的复用率,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。

强缓优先于协商缓存

1. Last - Modify:

Last-Modified/If-Modified-Since 的值代表的是文件的最后修改时间,第一次请求服务端会把资源的最后修改时间放到 Last-Modified 响应头中,第二次发起请求的时候,请求头会带上上一次响应头中的 Last-Modified 的时间,并放到 If-Modified-Since 请求头属性中,服务端根据文件最后一次修改时间和 If-Modified-Since 的值进行比较,如果相等,返回 304 ,并加载浏览器缓存。

  • Last-Modified:由服务器往客户端发送的 HTTP 响应头字段
  • If-Modified-Since:由客户端往服务器发送的请求头字段

首次打开响应http 200状态码,header头响应Last-Modified时间

再次刷新时,请求头带上了If-Modified-Since,和之前的资源的修改时间一致,直接响应304状态码,读取的缓存内容

修改文档的修改时间再刷新,响应头的Last-Modified发生改变,和请求头不变,响应http 200,返回资源数据.

Etag 的优先级高于 Last-Modified

2. E-tag :

    ETag/If-None-Match 的值是根据内容生成的hash 码,代表的资源的标识符,当服务端的文件变化的时候,它的 hash码会随之改变,通过请求头中的 If-None-Match 和当前文件的 hash 值进行比较,如果相等则表示命中协商缓存。

    ETag 又有强弱校验之分,如果 hash 码是以 "W/" 开头的一串字符串,说明此时协商缓存的校验是弱校验的,只有服务器上的文件差异(根据 ETag 计算方式来决定)达到能够触发 hash 值后缀变化的时候,才会真正地请求资源,否则返回 304 并加载浏览器缓存。

首次访问时,响应200,header头响应了etag

再次访问时,请求头带上了If-None-Match,此时资源校验没有变化直接响应304状态码,读取缓存内容

当我通过画图工具稍微调整了一下图片的尺寸,再次访问时,If-None-Match传递过来的hash和后台计算的不一致,header头重新返回响应的etag hash值,说明文件发生了修改,响应200,重新加载资源

3. 存在的弊端

E-tag的协商缓存,基于last-modified补充方案,cache-control可以完全替代expires的功能,在协商缓存中,但是ETag并非last-modified的替代方案,而是一种补充方案,依旧存在些弊端。

last-midify存在的弊端:

  1. 有些内容并没有变化,但是修改时间戳变化,导致协商缓存时关于有效性的判断验证为失效
  2. 某些资源不能得到文件的最后修改时间
  3. 资源修改的时间戳单位是秒,如果文件修改的速度非常快,在几百毫秒内完成,那么通过时间戳的方式来验证缓存的有效性,无法识别出该次文件资源是否更新
  4. 如果文件是通过服务器动态生成的,那么该方法的更新时间永远是生成的时间,尽管文件可能没有变化,所以起不到缓存的作用

e-tag存在的弊端:

  1. 服务器生成文件资源的ETag需要计算开销,如果资源的尺寸较大,数量较多且修改比较频繁,那么生成ETag的过程就会影响务器的性能。

  2. ETag字段值的生成分为强验证和弱验证,强验证根据资源内容进行生成,能够保证每个字节都相同;弱验证则根据资源的部分属性值来生成,生成速度快但无法确保每个字节都相同,并且在服务器集群场景下,也会因为不够准确而降低协商缓存有效性验证的成功率,所以恰当的方式是根据具体的资源场景选择恰当的缓存校验方式。

4. CDN缓存

1. CDN概念

CDN缓存,全称是Content Delivery Network,即内容分发网络。其原理是避开网络上可能存在的不稳定性和速率,使内容传输更快、更稳定。即通过网络各节点处放置节点服务器构成一层智能虚拟网络,能够实时根据网络流量和各节点的链接、负载、距离等因素将用户的请求重新导向最近的节点服务器上,使得用户可能就近获取访问内容,提高响应速率。

CDN拓扑图:

CDN缓存

浏览器本地缓存失效后,浏览器会向CDN边缘节点发起请求,类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。CDN边缘节点缓存一般都遵循HTTP标准协议,通过http响应头中的Cache-control: max-age的字段来设置CDN边缘节点数据缓存时间。

  • 当客户端向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点就会向源站发出回源请求,从源站拉取最新数据,更新本地缓存,并将最新数据返回给客户端。

2. CDN回源

当 CDN 缓存服务器中没有符合客户端要求的资源,CDN节点从回源站获取资源的过程叫回源。 CDN缓存时间会对“回源率”产生直接的影响。若CDN缓存时间较短,CDN边缘节点上的数据会经常失效,导致频繁回源,增加了源站的负载,同时也增大的访问延时;若CDN缓存时间太长,会带来数据更新时间慢的问题。

3. CDN的优缺点

优点:

  • CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;
  • 大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。 缺点: 当网站更新时,如果CDN节点上数据没有及时更新,即便用户在浏览器使用Ctrl +F5的方式使浏览器端的缓存失效,也会因为CDN边缘节点没有同步最新数据而导致用户访问异常。

5. 总结

同一个资源保证url唯一 对不同资源进行组合使用强制缓存、协商缓存及文件指纹或版本号 对于不经常改变的文件使用长期缓存,设置max-age=较大值 引入的一些第三方文件、打包出来的带有hash后缀css、js文件

打 赏