web缓存

目录

简述

服务器端缓存

CDN缓存

未使用CDN

使用CDN

CDN缓存判断文件是否需要更新的机制

CDN缓存刷新

前端缓存

http缓存 

http请求缓存过程

http缓存分类


简述

Web 缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、前端缓存(浏览器缓存(indexDB、cookie、localstorage 等等)、HTTP缓存)。本文重点介绍红色字体部分

在用户第一次访问网站后,网站的一些静态资源如图片等就会被下载到本地,作为缓存,当用户第二次访问该网站的时候,浏览器就会从缓存中加载资源,不用向服务器请求资源,从而提高了网站的访问速度,而若使用了CDN,当浏览器本地缓存的资源过期之后,浏览器不是直接向源站点请求资源,而是向CDN边缘节点请求资源,CDN边缘节点中也存在缓存,若CDN中的缓存也过期,那就由CDN边缘节点向源站点发出回源请求来获取最新资源。


服务器端缓存

CDN缓存

CDN:Content Delivery Network/Content Ddistribute Network,即内容分发网络
客户端请求数据时,先从本地缓存查找,如果被请求数据没有过期,拿过来用,如果过期,就向CDN边缘节点发起请求。CDN便会检测被请求的数据是否过期,如果没有过期,就返回数据给客户端,如果过期,CDN再向源站发送请求获取新数据。

未使用CDN

  1. 用户在浏览器访问栏中输入要访问的域名。
  2. 浏览器向DNS服务器请求对该域名的解析。
  3. DNS服务器返回该域名的IP地址给浏览器。
  4. 浏览器使用该IP地址向服务器请求内容。
  5. 服务器将用户请求的内容返回给浏览器。

使用CDN

  1. 用户在浏览器中输入要访问的域名。
  2. 浏览器向DNS服务器请求对域名进行解析。由于CDN对域名解析进行了调整,DNS服务器会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。
  3. CDN的DNS服务器将CDN的负载均衡设备IP地址返回给用户。
  4. 用户向CDN的负载均衡设备发起内容URL访问请求。
  5. CDN负载均衡设备会为用户选择一台合适的缓存服务器提供服务。选择的依据包括:根据用户IP地址,判断哪一台服务器距离用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器的负载情况,判断哪一台服务器的负载较小。基于以上这些依据的综合分析之后,负载均衡设置会把缓存服务器的IP地址返回给用户。
  6. 用户向缓存服务器发出请求。
  7. 缓存服务器响应用户请求,将用户所需内容传送到用户。

如果这台缓存服务器上并没有用户想要的内容,而负载均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉取到本地。

CDN缓存判断文件是否需要更新的机制

CDN节点缓存机制在不同服务商中是不同的,但一般都遵循HTTP协议,通过http响应头中的Cache-Control:max-age的字段来设置CDN节点文件缓存时间。当客户端向CDN节点请求数据时,CDN会判断缓存数据是否过期,若没有过期,则直接将缓存数据返回给客户端,否则就向源站点发出请求,从源站点拉取最新数据,更新本地缓存,并将最新数据返回给客户端。CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。CDN缓存时间会对“回源率”产生直接的影响,若CDN缓存时间短,则数据经常失效,导致频繁回源,增加了源站的负载,同时也增大了访问延时;若缓存时间长,数据更新时间慢,因此需要针对不同的业务需求来选择特定的数据缓存管理。

CDN缓存刷新

CDN节点对开发者时透明的,可以通过CDN服务商提供的“刷新缓存”接口来达到清理CDN节点缓存的效果,强制使数据过期,从而获取到最新的数据。


前端缓存

http缓存 

http请求缓存过程

  1. 浏览器第一次请求资源时,服务器返回资源,并在respone header头中回传资源的缓存参数,浏览器将其进行缓存;
  2. 第二次请求时,浏览器判断这些请求参数,命中强缓存就直接200(浏览器先根据这个资源的http头信息来判断是否命中强缓存。如果命中则直接加在缓存中的资源,并不会将请求发送到服务器。),否则就把请求参数加到request header头中传给服务器,看是否命中协商缓存,命中则返回304(如果未命中强缓存,则浏览器会将资源加载请求发送到服务器。服务器来判断浏览器本地缓存是否失效。若可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。),否则服务器会返回新的资源(如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存)。

http缓存分类

根据是否需要向服务器重新发起HTTP请求将缓存过程分为两个部分:强缓存和协商缓存

强缓存不会向服务器发送请求,直接从缓存中读取资源
可以通过设置三种http header实现,优先级从高到低为:Pragma --> Cache-Control --> Expires

  1. Pragma:http1.0的产物,值为no-cache时禁用缓存,现常用来做http的向下兼容。
  2. Cache-Control:用于控制缓存的行为,是一个通用首部字段,可组合多种指令使用。

指令     作用
public     表示响应可以被客户端和代理服务器缓存
private     表示响应只可以被客户端缓存
no-cache     资源被缓存,但是立即失效,下次会发起请求验证资源是否过期
no-store     不缓存任何响应
max-age=xx     缓存xx秒后就过期,需要重新请求
s-maxage=xx     覆盖max-age,作用一样,只在代理服务器中生效
max-stale=xx     表示xx秒内,即使缓存过期,也使用该缓存
min-fresh=xx     希望在xx秒内获取最新的响应

     3.Expires:缓存过期时间,用来指定资源到期的时间,是服务器端具体的时间点。

在强缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用协商缓存。
主要有以下两种情况:

    协商缓存生效,返回304和not modified。
    协商缓存失效,返回200和请求结果。

可以通过设置两种http header实现,优先级从高到低为:

    ETag/If-None-Match --> last-modified/If-Modified-Since

    Last-Modified/If-Modified-Since
    浏览器在第一次请求资源时,服务器返回资源的同时,在response header中添加 Last-Modified,指的是这个资源在服务器上的最后修改时间,浏览器接收后缓存文件和header;
    浏览器在下一次请求这个资源时,检测到header中有 Last-Modified,于是添加If-Modified-Since到header中,值就是Last-Modified的值;
    服务器再次收到这个资源请求,会根据If-Modified-Since中的值与服务器中这个资源的最后修改时间对比,如果没有变化,返回304和空的响应体,直接从缓存读取,如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件有更新,于是返回新的资源文件和200。

    ETag/If-None-Match
    ETag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),只要资源有变化,ETag就会重新生成。
    浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的ETag值放到request header里的If-None-Match里,服务器只需要比较客户端传来的If-None-Match跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。
    如果服务器发现ETag匹配不上,那么直接以常规GET 200回包形式将新的资源(当然也包括了新的ETag)发给客户端;
    如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。

总结:

浏览器第一次请求:

浏览器再次请求时:

参考文章:

https://www.cnblogs.com/ranyonsue/p/8918908.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值