zoukankan      html  css  js  c++  java
  • CDN和浏览器缓存

    1,CDN 旨在解决的最重要的问题是什么,我们称之为网络延迟,通过网络获取资源总是比从本地获取慢,无论服务器是在同一个局域网中还是位于世界的另一个角落,都是如此。这里的速度差异是 IT 行业的一个核心问题,开发者想了很多办法试图去弥补这个差异,CDN 就是应用最为广泛的一个解决方案。
    2,浏览器缓存 在未介入CDN之前,用户在第一次访问网站服务器的时候,浏览器会从服务器获取所有的资源,在传输过程中,浏览器会通过一些约定好的响应头,从而确定是否需要将这个资源保存一份到本地作为缓存。当用户第二次访问该网站的时候,浏览器就会优先从缓存中加载资源,不用向服务器请求资源,从而提高了网站的访问速度。
    3,浏览器缓存策略
    服务器会在资源返回的响应中,携带上以下四个常用的响应头,浏览器会通过判别这些响应值来决定资源缓存的状态。
    ETag Cache-Control Expires Last-Modified
    ETag 的值是一个字符串(数据的hash值),每个数据都有个标志,文件发生变化,这个标志发生变化。服务器可以在响应中返回 ETag,然后浏览器会在后续的请求中携带上这个参数来确定缓存是否需要更新。如果 ETag 值相同,说明资源未更改,服务器会返回 304(Not Modified) 响应码,浏览器就知道本地缓存仍然是可以使用的。
    ETag 只有在本地缓存已过期(Expires)或者缓存模式设置为 no-cache(Cache-Control)的时候,才会被浏览器携带上与服务器端的值进行判别。
    Cache-Control 可以携带多个响应值,这些值可以设置缓存时间、状态以及验证状态
    public 所有内容都要被缓存,客户端和代理服务器(CDN)都可以被缓存
    private 内容只能被缓存到客户端,不能被缓存到CDN
    no-cache 客户端必须和服务器确认ETag是否变化也就是资源是否被更改
    no-store 所有内容都不会被缓存
    must-revalidation/proxy-revalidation 缓存失效必须重新验证缓存内容
    max-age=xxx 缓存失效时间
    Expires 响应头标记数据的过期时间,例如:Expires: Sat, 27 Apr 2019 11:43:15 GMT 说明对应的数据会在 2019 年 4 月 27 号的 11 点 43 分后过期,如果 Cache-Control 中有 max-age 指令,浏览器会忽略此参数
    Last-Modified 服务器通过这个响应头,向浏览器发送数据上次被修改的时间,例如:Last-Modified:Wed, 24 Apr 2019 02:54:16 GMT 浏览器回对比本地和服务器的时间,服务器上的时间比本地时间要新,说明数据有更改,浏览器需要重新下载数据。
    Accept-Ranges:bytes
    Cache-Control:max-age=3600 // 缓存失效时间是1小时
    Connection:Keep-Alive
    Content-Length:4361
    Content-Type:image/png //这是png图片
    Date:Wed,24 Apr 2019 17:26:16 GMT
    ETag:"1109-554221c5c8540" //etag标识符 验证缓存是否变化
    Expires:Wed,24 Apr 2019 18:26:16 GMT //数据过期时间 max-age设置其会被忽略
    Keep-Alive:timeout=5,max=93
    Last-Modified:Mon,22 Apr 2019 08:21:34 GMT //上次资源被修改时间
    Server:Apache
    浏览器缓存的不足
    当服务器返回的响应中有 Expires 或者 Cache-Control 设置了 max-age 响应头的时候,浏览器不会向服务器发起校验请求,而是直接复用本地缓存。如果此时服务器进行了资源的更新,用户就无法获取到最新的资源,只能通过强制刷新浏览器缓存来跟服务器请求最新的资源。
     
    4,CDN缓存策略
    服务接入了 CDN 之后,浏览器本地缓存的资源过期之后,浏览器不是直接向源服务器请求资源,而是转而向 CDN 边缘节点请求资源。CDN 边缘节点中将用户的数据缓存起来,如果 CDN 中的缓存也过期了,CDN 边缘节点会向源服务器发出回源请求,从而来获取最新资源。以下介绍以又拍云 CDN 为例。
    CDN 节点缓存策略一般都会遵循 HTTP 标准协议,又拍云在没有匹配到自定义缓存规则且源服务器也没有返回任何有效缓存头的情况下,默认配置策略如下:
    针对静态资源,所有正常状态码(大于等于 200 小于 400)均缓存 8 天。特别地,301 响应缓存 2 小时,302 响应缓存 20 分钟;
    针对动态资源,程序会自动识别,则不进行缓存;
    对于其他大于等于 400 的不正常响应,则不进行缓存;
    缓存节点通知浏览器缓存的具体时间由 HTTP 响应头里面的 Cache-Control 和 Expires 响应头控制
    CDN缓存缺点 当源服务器资源更新后,如果 CDN 节点上缓存数据还未过期,用户访问到的依旧是过期的缓存资源,这会导致用户最终访问出现偏差。因此,开发者需要手动刷新相关资源,使 CDN 缓存保持为最新的状态。
    CDN缓存刷新 主动刷新(手动更新CDN资源)和被动刷新(等文件在 CDN 节点的缓存过期之后,节点回源拉取源服务器上最新的文件)
     
     

  • 相关阅读:
    notepad++一次去掉所有空行,然后加上2个空行
    mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错
    Xshell 5的快捷键
    word2010文档如何隐藏右侧灰色空白不可编辑区域
    记一次惊险的系统和分区修复
    nohup command 2>&1 & 的含义
    alexkn android第一行代码-7.广播
    android第一行代码-6.自定义控件的实现
    android第一行代码-5.监听器的两种用法和context
    android第一行代码-3.activity之间的调用跟数据传递
  • 原文地址:https://www.cnblogs.com/hellohell/p/10867544.html
Copyright © 2011-2022 走看看