精华内容
下载资源
问答
  • 文件过期前从 CloudFront 边缘缓存中删除文件 通过边缘缓存使文件失效。查看器下次请求文件时,CloudFront 将返回源以获取文件的最新版本。
  • 1.2.2 CDN缓存 1.2.3 DNS缓存 1.3 浏览器端缓存 1.3.1 浏览器缓存(http缓存) 1.3.2 HTML5离线应用缓存 1.4 web应用层缓存 CDN缓存 DNS缓存 浏览器缓存 1. web缓存的类型 本小节对大概的类型进行一个分类,剩下的...

    在本片文章中,将阅读到的内容有:

    1. web缓存的类型
      1.1数据库数据缓存
      1.2 服务器端缓存
      1.2.1 代理服务器缓存
      1.2.2 CDN缓存
      1.2.3 DNS缓存
      1.3 浏览器端缓存
      1.3.1 浏览器缓存(http缓存)
      1.3.2 HTML5离线应用缓存
      1.4 web应用层缓存
    2. 浏览器缓存
    3. CDN缓存
    4. DNS缓存

    1. web缓存的类型

    本小节对大概的类型进行一个分类,剩下的篇幅会选取部分内容进行详细的介绍。

    1.1数据库数据缓存

    Web应用,特别是SNS类型的应用,往往关系比较复杂,数据库表繁多,如果频繁进行数据库查询,很容易导致数据库不堪重荷。为了提供查询的性能,会将查询后的数据放到内存中进行缓存,下次查询时,直接从内存缓存直接返回,提供响应效率。比如常用的缓存方案有memcached等。

    1.2 服务器端缓存

    1.2.1 代理服务器缓存

    代理服务器是浏览器和源服务器之间的中间服务器,浏览器先向这个中间服务器发起Web请求,经过处理后(比如权限验证,缓存匹配等),再将请求转发到源服务器。代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。可以把它理解为一个共享缓存,不只为一个用户服务,一般为大量用户提供服务,因此在减少相应时间和带宽使用方面很有效,同一个副本会被重用多次。常见代理服务器缓存解决方案有 Squid等。

    1.2.2 CDN缓存

    CDN(Content delivery networks, 即内容分发网络。)缓存,也叫网关缓存、反向代理缓存。CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展并获得更好的性能。**浏览器先向CDN网关发起Web请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态将请求转发到合适的源服务器上。**虽然这种架构负载均衡源服务器之间的缓存没法共享,但却拥有更好的处扩展性。从浏览器角度来看,整个CDN就是一个源服务器。

    1.2.3 DNS缓存

    1.3 浏览器端缓存
    1.3.1 浏览器缓存(http缓存)
    1.3.2 HTML5离线应用缓存
    本篇对这个内容就不进行详细的介绍,可以参考这篇文章。
    https://www.cnblogs.com/xiaotaiyangye/p/10910353.html
    1.4 web应用层缓存

    2. 浏览器缓存(http缓存)

    2.1 什么是浏览器缓存

    浏览器缓存就是把一个已经请求过的web资源(如html页面,图片,JS,数据)拷贝一份放在浏览器中。缓存会根据进来的请求保存输入内容的副本。当下一个请求到来的时候,如果是相同的URL,浏览器会根据缓存机制决定是直接使用副本响应访问请求还是向源服务器再次发起请求。

    浏览器缓存还分为强缓存和协商缓存。

    2.2 强缓存

    强缓存是利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间。

    2.2.1 Expires

    该字段是http1.0时的规范,它的值为一个绝对时间的GMT格式的时间字符串,比如

    Expires:Mon,18 Oct 206623:59:59 GMT。

    这个时间代表着这个资源的失效时间,在此时间之前,即命中缓存。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当服务器与客户端时间偏差较大时,就会导致缓存混乱。

    2.2.2 Cache-Control

    Cache-Control是http1.1时出现的header信息,主要是利用该字段的max-age值来进行判断,它是一个相对时间,比如

    Cache-Control:max-age=3600

    代表着资源的有效期是3600秒。

    cache-control除了该字段外,还有下面几个比较常用的设置值:

    no-cache不使用本地缓存。需要使用协商缓存,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
    no-store直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
    public可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
    private只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。

    Cache-Control与Expires可以在服务端配置同时启用,同时启用的时候Cache-Control优先级高

    2.3 协商缓存

    协商缓存就是由服务器来确定缓存资源是否可用,所以客户端与服务器端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问,这主要涉及到下面两组header字段,这两组搭档都是成对出现的,即第一次请求的响应头带上某个字段(Last-Modified或者Etag),则后续请求则会带上对应的请求字段(If-Modified-Since或者If-None-Match),若响应头没有Last-Modified或者Etag字段,则请求头也不会有对应的字段。·

    2.3.1 Last-Modify/If-Modify-Since

    浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modified,Last-Modified是一个时间,标识该资源的最后修改时间,例如

    Last-Modified: Thu,31 Dec 2037 23:59:59 GMT

    当浏览器再次请求该资源时,request的请求头中会包含If-Modified-Since,该值为缓存之前返回的Last-Modified。服务器收到If-Modified-Since后,根据资源的最后修改时间判断是否命中缓存。

    如果命中缓存,则返回304,并且不会返回资源内容,并且不会返回Last-Modified。

    2.3.2 ETag/If-None-Match

    与Last-Modified/If-Modified-Since不同的是,Etag/If-None-Match返回的是一个校验码。ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化。服务器根据浏览器发送的If-None-Match值来判断是否命中缓存。

    与Last-Modified不一样的是,当服务器返回304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化。

    HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

    • 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
    • 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);
    • 某些服务器不能精确的得到文件的最后修改时间。
    • Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

    2.4 强缓存 vs 协商缓存

    在这里插入图片描述

    2.5 浏览器缓存的优点

    • 减少了冗余的数据传输,节省了网费
    • 减少了服务器的负担,大大提升了网站的性能
    • 加快了客户端加载网页的速度

    2.6 用户行为对缓存的影响

    用户在浏览器上的一些操作,会导致缓存受到影响。

    在这里插入图片描述
    2.6.1. 在地址栏中输入网址后按回车或点击转到按钮

    浏览器以最少的请求来获取网页的数据,浏览器会对所有没有过期的内容直接使用本地缓存,从而减少了对浏览器的请求。所以,Expires,max-age标记只对这种方式有效。

    2.6.2. 按F5或浏览器刷新按钮

    浏览器会在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存,它能够让 Last-Modified、ETag发挥效果,但是对Expires无效。

    2.6.3. 按Ctrl+F5或按Ctrl并点击刷新按钮

    这种方式就是强制刷新,总会发起一个全新的请求,不使用任何缓存。

    2.7 实际问题运用

    代码更新到线上后用户浏览器不能自行更新,我们不能要求客户在系统更新后都进行一次缓存清理的操作。到底该如何解决呢?

    在资源请求的URL中增加一个参数,比如:js/mian.js?ver=0.7.1。这个参数是一个版本号,每一次部署的时候变更一下,当这个参数变化的时候,强缓存都会失效并重新加载。这样一来,静态资源,部署以后就需要重新加载。这样就比较完美的解决了问题。

    3. CDN缓存

    3.1 什么是CDN缓存

    CDN是指内容分发网络。各地部署多套静态存储服务,本质上是空间换时间,自动选择最近的节点内容,不存在再请求原始服务器,适合存储更新很少的静态内容,文件更新慢。

    用更通俗的话来说,CDN是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。

    3.2 CDN缓存使用场景

    在没有CDN的情况下
    在这里插入图片描述
    用户在浏览网站的时候,浏览器能够在本地保存网站中的图片或者其他文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了下载量意味着提高了页面加载的速度。

    在有CDN的情况下
    在这里插入图片描述
    客户端浏览器先检查是否有本地缓存是否过期,如果过期,则向CDN边缘节点发起请求,CDN边缘节点会检测用户请求数据的缓存是否过期,如果没有过期,则直接响应用户请求,此时一个完成http请求结束;如果数据已经过期,那么CDN还需要向源站发出回源请求(back to the source request),来拉取最新的数据。

    下图是一个比较典型的CDN缓存的应用。
    在这里插入图片描述
    使用第三方的CDN服务:如果想要开源一些项目,可以使用第三方的CDN服务
    使用CDN进行静态资源的缓存:将自己网站的静态资源放在CDN上,比如js、css、图片等。可以将整个项目放在CDN上,完成一键部署。
    直播传送:直播本质上是使用流媒体进行传送,CDN也是支持流媒体传送的,所以直播完全可以使用CDN来提高访问速度。CDN在处理流媒体的时候与处理普通静态文件有所不同,普通文件如果在边缘节点没有找到的话,就会去上一层接着寻找,但是流媒体本身数据量就非常大,如果使用回源的方式,必然会带来性能问题,所以流媒体一般采用的都是主动推送的方式来进行。

    3.3 CDN的组成部分:
    典型的CDN系统由下面三个部分组成:
    分发服务系统: 最基本的工作单元就是Cache设备,cache(边缘cache)负责直接响应最终用户的访问请求,把缓存在本地的内容快速地提供给用户。同时cache还负责与源站点进行内容同步,把更新的内容以及本地没有的内容从源站点获取并保存在本地。Cache设备的数量、规模、总服务能力是衡量一个CDN系统服务能力的最基本的指标。
    负载均衡系统: 主要功能是负责对所有发起服务请求的用户进行访问调度,确定提供给用户的最终实际访问地址。两级调度体系分为全局负载均衡(GSLB)和本地负载均衡(SLB)。全局负载均衡主要根据用户就近性原则,通过对每个服务节点进行“最优”判断,确定向用户提供服务的cache的物理位置。本地负载均衡主要负责节点内部的设备负载均衡
    运营管理系统: 运营管理系统分为运营管理和网络管理子系统,负责处理业务层面的与外界系统交互所必须的收集、整理、交付工作,包含客户管理、产品管理、计费管理、统计分析等功能。

    3.4 CDN的作用

    CDN一般会用来托管Web资源(包括文本、图片和脚本等),可供下载的资源(媒体文件、软件、文档等),应用程序(门户网站等)。使用CDN来加速这些资源的访问。
    (1)在性能方面,引入CDN的作用在于:
    ● 用户收到的内容来自最近的数据中心,延迟更低,内容加载更快
    ● 部分资源请求分配给了CDN,减少了服务器的负载
    (2)在安全方面,CDN有助于防御DDoS、MITM等网络攻击:
    ● 针对DDoS:通过监控分析异常流量,限制其请求频率
    ● 针对MITM:从源服务器到 CDN 节点到 ISP(Internet Service Provider),全链路 HTTPS 通信
    除此之外,CDN作为一种基础的云服务,同样具有资源托管、按需扩展(能够应对流量高峰)等方面的优势。

    3.5 CDN的工作原理

    CDN和DNS有着密不可分的联系,先来看一下DNS的解析域名过程,在浏览器输入 www.test.com 的解析过程如下: (1) 检查浏览器缓存 (2)检查操作系统缓存,常见的如hosts文件 (3)检查路由器缓存 (4)如果前几步都没没找到,会向ISP(网络服务提供商)的LDNS服务器查询 (5)如果LDNS服务器没找到,会向根域名服务器(Root Server)请求解析,分为以下几步
    ● 根服务器返回顶级域名(TLD)服务器如.com,.cn,.org等的地址,该例子中会返回.com的地址
    ● 接着向顶级域名服务器发送请求,然后会返回次级域名(SLD)服务器的地址,本例子会返回.test的地址
    ● 接着向次级域名服务器发送请求,然后会返回通过域名查询到的目标IP,本例子会返回www.test.com的地址
    ● Local DNS Server会缓存结果,并返回给用户,缓存在系统中
    CDN的工作原理
    (1)用户未使用CDN缓存资源的过程:
    1.浏览器通过DNS对域名进行解析(就是上面的DNS解析过程),依次得到此域名对应的IP地址
    2. 浏览器根据得到的IP地址,向域名的服务主机发送数据请求
    3. 服务器向浏览器返回响应数据
    (2)用户使用CDN缓存资源的过程:
    1.对于点击的数据的URL,经过本地DNS系统的解析,发现该URL对应的是一个CDN专用的DNS服务器,DNS系统就会将域名解析权交给CNAME指向的CDN专用的DNS服务器。
    2. CND专用DNS服务器将CND的全局负载均衡设备IP地址返回给用户
    3. 用户向CDN的全局负载均衡设备发起数据请求
    4. CDN的全局负载均衡设备根据用户的IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求
    5. 区域负载均衡设备选择一台合适的缓存服务器来提供服务,将该缓存服务器的IP地址返回给全局负载均衡设备
    6. 全局负载均衡设备把服务器的IP地址返回给用户
    7. 用户向该缓存服务器发起请求,缓存服务器响应用户的请求,将用户所需内容发送至用户终端。
    如果缓存服务器没有用户想要的内容,那么缓存服务器就会向它的上一级缓存服务器请求内容,以此类推,直到获取到需要的资源。最后如果还是没有,就会回到自己的服务器去获取资源。

    4. DNS缓存

    4.1 什么是DNS

    全称 Domain Name System ,即域名系统。
    通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)

    有dns的地方,就有缓存。浏览器、操作系统、Local DNS、根域名服务器,它们都会对DNS结果做一定程度的缓存。

    DNS查询过程如下:

    1. 首先搜索浏览器自身的DNS缓存,如果存在,则域名解析到此完成。
    2. 如果浏览器自身的缓存里面没有找到对应的条目,那么会尝试读取操作系统的hosts文件看是否存在对应的映射关系,如果存在,则域名解析到此完成。
    3. 如果本地hosts文件不存在映射关系,则查找本地DNS服务器(ISP服务器,或者自己手动设置的DNS服务器),如果存在,域名到此解析完成。
    4. 如果本地DNS服务器还没找到的话,它就会向根服务器发出请求,进行递归查询。

    参考文章:
    https://blog.csdn.net/toumingyumaohuiyi/article/details/52763989
    https://blog.csdn.net/qq_40968685/article/details/109507853?utm_source=app&app_version=4.16.0
    https://blog.csdn.net/qq_41807489/article/details/90266230
    https://www.cnblogs.com/iceflorence/p/8905825.html

    展开全文
  • 主要介绍了PHP文件生成的图片无法使用CDN缓存的解决方法,这里的PHP生成图片是指src地址是一个PHP文件的图片,如果不做CDN,服务器的压力会非常大,本文就讲解了如何加进CDN的方法,需要的朋友可以参考下
  • 浏览器缓存和CDN缓存

    千次阅读 2019-05-16 16:30:22
    CDN是什么? ...

    CDN是什么?                                                                                                                                                                                                                                                                                                一分钟学会使用CDN


    谈到CDN的作用,可以用8年买火车票的经历来形象比喻:

    8年前,还没有火车票代售点一说,12306.cn更是无从说起。那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火车,火车票都要去市里的火车站购买,而从县城到市里,来回就是4个小时车程,简直就是浪费生命。后来就好了,小县城里出现了火车票代售点,可以直接在代售点购买火车,方便了不少,全市人民再也不用在一个点苦逼的排队买票了。
     

    CDN就可以理解为分布在每个县城的火车票代售点,用户在浏览网站的时候,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求,这样海南移动用户的请求就不会千里迢迢跑到北京电信机房的服务器(假设源站部署在北京电信机房)上了。

    CDN的优势很明显:

    (1)CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;

    (2)大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。

    首先,看看没有网站没有接入CDN时,用户浏览器与服务器是如何交互的:

    q111.png

    用户在浏览网站的时候,浏览器能够在本地保存网站中的图片或者其他文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了下载量意味着提高了页面加载的速度。

    如果中间加上一层CDN,那么用户浏览器与服务器的交互如下:

    q222.png

    客户端浏览器先检查是否有本地缓存是否过期,如果过期,则向CDN边缘节点发起请求,CDN边缘节点会检测用户请求数据的缓存是否过期,如果没有过期,则直接响应用户请求,此时一个完成http请求结束;如果数据已经过期,那么CDN还需要向源站发出回源请求(back to the source request),来拉取最新的数据。CDN的典型拓扑图如下:
     

    q333.png

     

    图片来源:http://grefr.iteye.com/blog/2004248
     

    可以看到,在存在CDN的场景下,数据经历了客户端(浏览器)缓存和CDN边缘节点缓存两个阶段,下面分别对这两个阶段的缓存进行详细的剖析
    客户端(浏览器)缓存
    客户端缓存的缺点 

    客户端缓存减少了的服务器请求,避免了文件重复加载,显著地提升了用户地方。但是当网站发生了更新的时候(如替换了css、js以及图片文件),浏览器本地仍保存着旧版本的文件,从而导致无法预料后果。
     

    曾几何时,一个页面加载出来,页面各元素位置乱飘,按钮点击失效,前端GG都会习惯性地问一句:“缓存清了没?”,然后Ctrl+F5       ,Everything is OK。但有些时候,如果我们是简单地在浏览器地址栏中敲一个回车,或者是仅仅按F5刷新,问题依然没有解决,你可知道这三种不同的操作方式,决定浏览器不同的刷新缓存策略?
    浏览器如何来确定使用本地文件还是使用服务器上的新文件?下面来介绍几种判断的方法。
    浏览器缓存策略

    Expires 

    Expires:Sat, 24 Jan 2015 20:30:54 GMT

    q444.png

    如果http响应报文中设置了Expires,在Expires过期之前,我们就避免了和服务器之间的连接。此时,浏览器无需想浏览器发出请求,只需要自己判断手中的材料是否过期就可以了,完全不需要增加服务器的负担。

    Cache-control: max-age
    q555.png

    Expires的方法很好,但是我们每次都得算一个精确的时间。max-age 标签可以让我们更加容易的处理过期时间。我们只需要说,这份资料你只能用一个星期就可以了。
    Max-age 使用秒来计量,如:

    Cache-Control:max-age=645672

    指定页面645672秒(7.47天)后过期。
     

    Last-Modified

    服务器为了通知浏览器当前文件的版本,会发送一个上次修改时间的标签,例如:

    Last-Modified:Tue, 06 Jan 2015 08:26:32 GMT

    q666.png

    这样浏览器就知道他收到的这个文件创建时间,在后续的请求中,浏览器会按照下面的规则进行验证:

    1.  浏览器:Hey,我需要jquery.min.js这个文件,如果是在 Tue, 06 Jan 2015 08:26:32 GMT 之后修改过的,请发给我。

    2.  服务器:(检查文件的修改时间)

    3.  服务器:Hey,这个文件在那个时间之后没有被修改过,你已经有最新的版本了。

    4.  浏览器:太好了,那我就显示给用户了。

    在这种情况下,服务器仅仅返回了一个304的响应头,减少了响应的数据量,提高了响应的速度。关于304响应,请参考:

    http://www.cnblogs.com/ziyunfei/archive/2012/11/17/2772729.html

    下图是按F5刷新页面后,页面返回304响应头。

    q777.png


    ETag 

    通常情况下,通过修改时间来比较文件是可行的。但是在一些特殊情况,例如服务器的时钟发生了错误,服务器时钟进行修改,夏时制DST到来后服务器时间没有及时更新,这些都会引起通过修改时间比较文件版本的问题。
    ETag可以用来解决这种问题。ETag是一个文件的唯一标志符。就像一个哈希或者指纹,每个文件都有一个单独的标志,只要这个文件发生了改变,这个标志就会发生变化。
    服务器返回ETag标签:

    ETag:"39001d-1762a-50bf790757e00"

    q888.png

    接下来的访问顺序如下所示:

    1. 浏览器:Hey,我需要jquery.min.js这个文件,有没有不匹配"39001d-1762a-50bf790757e00"这个串的

    2. 服务器:(检查ETag…)

    3. 服务器:Hey,我这里的版本也是"39001d-1762a-50bf790757e00",你已经是最新的版本了

    4. 浏览器:好,那就可以使用本地缓存了

    如同 Last-modified 一样,ETag 解决了文件版本比较的问题。只不过 ETag 的级别比 Last-Modified 高一些。

    额外的标签

    缓存标签永远不会停止工作,但是有时候我们需要对已经缓存的内容进行一些控制。

    l  Cache-control: public 表示缓存的版本可以被代理服务器或者其他中间服务器识别。

    l  Cache-control: private 意味着这个文件对不同的用户是不同的。只有用户自己的浏览器能够进行缓存,公共的代理服务器不允许缓存。

    l  Cache-control: no-cache 意味着文件的内容不应当被缓存。这在搜索或者翻页结果中非常有用,因为同样的URL,对应的内容会发生变化。

    q999.png


    浏览器缓存刷新 

    1.  在地址栏中输入网址后按回车或点击转到按钮

    浏览器以最少的请求来获取网页的数据,浏览器会对所有没有过期的内容直接使用本地缓存,从而减少了对浏览器的请求。所以,Expires,max-age标记只对这种方式有效。

    2.  按F5或浏览器刷新按钮

    浏览器会在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存,它能够让 Last-Modified、ETag发挥效果,但是对Expires无效。

    3.  按Ctrl+F5或按Ctrl并点击刷新按钮

    这种方式就是强制刷新,总会发起一个全新的请求,不使用任何缓存。
     

    CDN缓存 

    浏览器本地缓存失效后,浏览器会向CDN边缘节点发起请求。类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。

    CDN缓存的缺点 CDN的分流作用不仅减少了用户的访问延时,也减少的源站的负载。

    但其缺点也很明显:当网站更新时,如果CDN节点上数据没有及时更新,即便用户再浏览器使用Ctrl +F5的方式使浏览器端的缓存失效,也会因为CDN边缘节点没有同步最新数据而导致用户访问异常。

    CDN缓存策略 

    CDN边缘节点缓存策略因服务商不同而不同,但一般都会遵循http标准协议,通过http响应头中的Cache-control: max-age的字段来设置CDN边缘节点数据缓存时间。当客户端向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点就会向源站发出回源请求,从源站拉取最新数据,更新本地缓存,并将最新数据返回给客户端。
    CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。

    CDN缓存时间会对“回源率”产生直接的影响。若CDN缓存时间较短,CDN边缘节点上的数据会经常失效,导致频繁回源,增加了源站的负载,同时也增大的访问延时;若CDN缓存时间太长,会带来数据更新时间慢的问题。开发者需要增对特定的业务,来做特定的数据缓存时间管理。
     

    CDN缓存刷新

    CDN边缘节点对开发者是透明的,相比于浏览器Ctrl+F5的强制刷新来使浏览器本地缓存失效,开发者可以通过CDN服务商提供的“刷新缓存”接口来达到清理CDN边缘节点缓存的目的。这样开发者在更新数据后,可以使用“刷新缓存”功能来强制CDN节点上的数据缓存过期,保证客户端在访问时,拉取到最新的数据。

    展开全文
  • 最近测试遇到修改host文件后,清除浏览器缓存后,重启浏览器后,发现浏览器还是访问老DNS服务,于是网上查查原因,豁然开朗。 这里对互联网上一些文章进行整理,原文可查看参。 1、DNS 缓存 1.1 什么是DNS ...

    最近测试遇到修改host文件后,清除浏览器缓存后,重启浏览器后,发现浏览器还是访问老DNS服务,于是网上查查原因,豁然开朗。

    这里对互联网上一些文章进行整理,原文可查看参。

     

    1、DNS 缓存

    1.1 什么是DNS

    全称 Domain Name System ,即域名系统。

    万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。DNS协议运行在UDP协议之上,使用端口号53。

    简单的说,通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。

    www.dnscache.com (域名) - DNS解析 -> 11.222.33.444 (IP地址)

    1.2 DNS缓存解析流程

    有dns的地方,就有缓存。浏览器、操作系统、Local DNS、根域名服务器,它们都会对DNS结果做一定程度的缓存。

    DNS查询过程如下:

    1. 首先搜索浏览器自身的DNS缓存,如果存在,则域名解析到此完成。
    2. 如果浏览器自身的缓存里面没有找到对应的条目,那么会尝试读取操作系统的hosts文件看是否存在对应的映射关系,如果存在,则域名解析到此完成。
    3. 如果本地hosts文件不存在映射关系,则查找本地DNS服务器(ISP服务器,或者自己手动设置的DNS服务器),如果存在,域名到此解析完成。
    4. 如果本地DNS服务器还没找到的话,它就会向根服务器发出请求,进行递归查询。

     

    针对具体某一具体域名的访问,DNS 域名解析过程实际上是一个相当复杂的过程,需要经过多级迭代查询才能成功获取业务地址,以用户通过互联网访问民生银行官方网站系统 www.cmbc.com.cn 为例,其详细过程如下图所示:

     

    1. 当用户访问民生网站时,在 WEB 浏览器里输入 www.cmbc.com.cn 时,浏览器先检查是否有该网站的缓存(域名与 IP 的映射关系),有则直接使用访问,如果没有 DNS 请求发送到客户端解析器

    2. 假设后续环节都没有缓存,解析器将 DNS 请求发送给运营商 Local DNS 服务器处理,运营商 Local DNS 依次向 cn.、com.cn.、cmbc.com.cn.域名服务器发起迭代查询,并缓存查询结果,同时将结果返回给用户,实现业务访问。

    3. 在高速缓存未超时的时间内,客户浏览器再次发送到域名 www.cmbc.com.cn 的访问将不再需要经过以上迭代查询过程,将直接由客户本地电脑解析器缓存或本地 DNS 服务器缓存直接返回域名对应的 IP 地址

    企业内网域名解析系统一般设计为一级(仅权威 DNS 服务器)或两级架构(包含本地 DNS 服务器和权威 DNS 服务器),不需要经过上述运营商多级域名迭代查询过程,其它解析过程与上述过程基本一致,客户端和本地 DNS 服务器同样可提供高速缓功能。

    1.3 DNS 缓存作用

          DNS 域名系统给应用访问带来了额外的时延,另外由于 DNS 域名解析采用不可靠的 UDP 协议通讯,受内外部网络环境的影响较大,特别是在有丢包的情况下,导致的时延可能达到数秒。为缓解此问题,DNS 解析采用了缓存(Cache)机制。

          如上节 DNS 解析过程可知,经过第一次客户访问之后,本地 DNS 服务器和客户端均会缓存之前解析到的域名和 IP 地址映射,并基于相关机制设置相应的缓存生存时间(TTL),在 TTL 超时时间段内,后续 DNS 域名解析直接通过客户端本地和本地 DNS 服务器高速缓存解析,不再需要经过迭代查询过程。DNS 缓存可极大提升 DNS 域名解析的效率,一定程度上减少了客户端到用户之间环境对 DNS 域名解析的影响。

          高速缓存的缺点在于它需要消耗一定的系统资源,并增加了域名系统的复杂性。决定解析结果在高速缓存中保留多长时间是在 DNS 域名建设和维护时需要重点考虑的问题。如果缓存时间过短,则可能会导致产生多余的不必要的解析请求,如果缓存时间过长,则可能导致域名变更时客户访问恢复时间过长。

     

    1.4 DNS 缓存使用面临的问题

          缓存技术在用户业务访问过程中起到了加速访问、提升用户体验的重要作用,若缓存设置使用不当,则可能给用户访问体验带来负面影响,甚至影响用户正常业务访问。缓存被使用在互联网非受控环境和内网相对可控环境,在不同的环境会面临不同的使用问题,下面来看看缓存在互联网和内网环境使用中可能会面临哪些问题。

    1.4.1 互联网环境缓存应用面临的问题

          在互联网环境,缓存存在于浏览器、操作系统、运营商 Local DNS 服务器,其中运营商 Local DNS 是最重要且最不受用户和网站管理员控制的一个环节,如果缓存值设置不合理,将直接影响用户访问,会给企业形象带来负面影响。对于网站管理员来说,互联网环境的缓存面临两大方面问题:

    缓存刷新不受控:一般企业为实现线路冗余都会使用多家运营商,因此域名就会被缓存在多家运营商 Local DNS 服务器,当企业域名发生改变时,涉及 Local DNS 服务器众多,在当前环境下,管理员无法刷新运营商 Local DNS 服务器缓存,在缓存未超时的情况下,客户无法获取到正确的域名进行业务访问,只能等待 Local DNS 服务器缓存超时后才能解析到正确的域名,正常访问业务,此种情况可能严重影响客户体验,导致大量的客户投诉。

    解析权和缓存值被修改一些小运营商出于规模、节约成本的考虑,将域名转发到其他运营商进行解析,并把收到的域名缓存值更改为较长的值,这会带来两个方面的问题:

    • 1)权威 DNS 接收到的请求 IP 地址不是客户所在运营商 IP 地址,客户的请求可能会被引导至错误的线路,导致客户访问慢;
    • 2)企业域名发生改变后将等待更长的超时时间才能正常访问业务;同样会给客户带来较差的体验。

     

    1.4.2 企业内网缓存应用面临的问题

          企业内网环境相对简单,通常情况下用户会直接向权威服务器发起域名解析请求,内网域名解析路径较互联网可控且环境稳定,无运营商递归查询环节,因此基本不存在不可控的三方服务器和缓存被修改的问题。

          企业内网环境包括两类用户,一类为终端用户,例如柜员、业务管理人员、办公人员,这类用户使用电脑通过浏览器访问目标业务;另一类为生产系统,这类用户为服务器,通过应用软件访问目标业务。两类用户涉及的基础运行环境各不相同,缓存在使用中面临的问题也会有所不同。

    终端用户面临的问题

          内网终端用户与互联网用户类似,差异是内网无中间运营商,它的缓存存在于浏览器、终端操作系统,若缓存值设置过长,当出现业务地址变更的时候,用户将无法访问业务,可能会影响办公或者影响客户办理业务,须等待本地缓存超时方可恢复。在终端用户层面,目标业务域名改变一般为单个系统,不会出现大面积变更的情况,且对象为内网用户,可建立统一的标准规范,因此影响范围相对较小。

    生产系统面临的问题

          为实现业务快速切换以及运维便利,企业生产系统之间也开始大力推广通过域名方式访问,但生产系统使用的操作系统、编程语言等各不相同。

     

    我们针对常用的操作系统和 JDK 环境的 DNS 缓存行为进行了全面测试,具体包括了 Suse12、AIX7.1、JDK1.6/1.7 等常用版本,经过测试得出以下结论:

    • 1)Suse 操作系统默认不开启缓存,当开启缓存时,继承 DNS 记录的缓存值
    • 2)AIX 操作系统默认不开启缓存,当开启缓存时,不继承 DNS 记录的缓存值,继承操作系统本地配置的缓存超时时间
    • 3)JDK 默认开启缓存,不继承 DNS 记录的缓存值,遵循自身配置的超时时间

          从以上实际测试结果可以看出不同的操作系统和 JDK 环境对 DNS 缓存的处理机制不一样。中间件如 Weblogic、Tomcat 建立链接时会调用 JDK,业务在实际部署中,会根据需求选择不同的操作系统和中间件,例如 Suse 和 AIX 的操作系统都可以选择 Weblogic 或者 Tomcat 部署应用,不同的组合 DNS 缓存处理机制会不一样,从而对应用访问产生不同的影响。以 Suse 和 AIX 两类操作系统、中间件使用 Weblogic 为例,来看看缓存的影响:

          假设操作系统和中间件均开启缓存,场景为应用访问数据库,配置 JDK 缓存 30s,操作系统缓存 1 分钟,DNS 域名 TTL 值为 2 分钟,当 APP 成功访问一次 DB 后,JDK 缓存域名时间为 30s,Suse 操作系统继承 DNS TTL 值缓存域名时间为 2 分钟,当域名发生变化时,JDK 经历 30s 后超时,但是操作系统还未超时,获取到的域名仍然为老地址,导致业务访问不通,影响时间增加 1 分半钟。同样的场景,若操作系统为 AIX,它不认可 DNS TTL 值,缓存为配置的 1 分钟,影响时间仅增加 30s。

          由此可见,不同操作系统、不同 JDK、不同 DNS TTL 配置,将会产生不一样的影响,当业务出现故障时由于缓存行为不一致,会给排障增加困难,运维变得复杂,无法满足快速恢复业务的需求,而且生产系统通常都不是孤立存在的,当一个系统出现问题时很有可能产生连锁反应,导致多个业务系统服务不可用,影响面更广,后果更严重。

     

    1.5 DNS 缓存在实际应用中的考虑

          DNS 缓存在使用中会面临缓存无法刷新、被修改以及缓存控制复杂等问题,无论在互联网还是内网,缓存设置不合理都将导致用户无法访问业务,影响用户体验,那么缓存设置就显得尤为重要,它在实际应用中应该如何考虑?

          首先,哪些情况下域名会发生改变,从而出现影响用户访问的情况:

    • 主动操作:由于系统新建迁移、灾备切换等有计划的变更操作
    • 被动操作:当出现故障需要紧急更改域名对应的服务地址恢复业务

          不同场景产生的影响时间以及紧迫程度有所不同,就有不同的考虑因素,下面针对不同的场景分别进行介绍。

     

    1.5.1、主动操作之缓存考虑因素

          针对主动操作的情况,有计划性,会有充足的时间准备,内网和互联网环境均可提前将域名对应的缓存值更改为更小的值,操作等待时间大于设置的缓存值即可,以确保递归服务器缓存了设置较小的 TTL 值,待操作完成后再更改回原有 TTL 值,无需人工干预。

          另外,避免缓存带来影响,还可以规范架构部署,例如通过负载均衡或者虚地址方式对外提供服务,可减少域名变化的情况,负载均衡或者虚地址方式可把操作隐藏在服务端,不会传达到客户端,可直接避免缓存时间给用户带来的影响。

    1.5.2、被动操作之互联网缓存考虑因素

          互联网用户直接面向运营商,面临的问题是无法刷新缓存和缓存值被修改,要解决域名更改后无法快速生效的问题,需要从运营商入手:

     

    刷新运营商 Local DNS 缓存

          当我行一条运营商线路故障时,这条线路对应业务 DNS 记录被用户及对应运营商 Local DNS 服务器缓存,经了解,三大运营商正在开发刷新缓存的功能,电信和联通支持基于单个域名自助刷新全国对应 Local DNS 缓存,目前正处于测试阶段,预计三分钟可以完成全国 Local DNS 缓存强制刷新;移动目前支持北京地区 Local DNS 缓存记录刷新,其他地区正在计划开发中。

          三大运营商都支持刷新缓存的情况下,将很大程度解决缓存生效慢的问题。但是一些小运营商不在合作范围内,目前仍然没有办法更新他们的缓存,可能会有少量地区客户仍然会有所影响。

    避免缓存被修改

          互联网环境最大的问题是 Local DNS 缓存,缓存时间被修改,有没有方式可以避开 Local DNS?近几年 HTTP DNS 技术出现了,它是基于 HTTP 协议向 HTTP DNS 服务器发送域名解析请求,替代了基于 DNS 协议向运营商 Local DNS 发起解析请求的传统方式,有效的避开了运营商 Local DNS,就避免了缓存值被第三方修改

    HTTP DNS 解析流程

     

    • 1、客户端通过 HTTP/HTTPS 协议向 HTTP DNS 集群发起查询请求,携带用户域名和终端 IP
    • 2、服务集群查询 CDN 内部调度系统,将域名最佳访问节点 IP 响应给客户端
    • 3、客户端收到响应结果向节点发起请求
    • 4、客户端拿到最优 IP 后,发起业务访问
    • 5、若客户端访问 HTTP DNS 集群失败,可自动切换为传统方式通过运营商 Local DNS 进行解析查询

    HTTP DNS 优点

    1. 绕过运营商 Local DNS,防劫持

    2. 能直接获取到客户端 IP 地址,更精准的返回结果,避免跨运营商

    3. 无运营商缓存,域名变更快速生效

    4. HTTP DNS 可以在终端 APP DNS 缓存超时之前提前进行解析,规避了缓存再解析导致延时的问题

    5. 与传统方式互备,当 HTTP DNS 不可用时可选择传统方式备份访问

    HTTP DNS 适用场景

          HTTP DNS 主要是为 APP 类或桌面应用提供服务,如游戏、电商、金融、音视频、社交类 APP。HTTP DNS 需要在 APP 加载相应的 SDK 对默认的 DNS 请求方式进行修改,因此 HTTP DNS 的实现需要开发配合和深度介入,另外一般一个 APP 的访问会涉及多个域名,每个域名都使用 HTTP DNS 还是只是部分域名访问使用 HTTP DNS 需要评估。更细节的实现如缓存规则、更新规则、监控及切换规则也需要进行详细的考虑和设计。

     

    1.5.3、被动操作之内网缓存考虑因素

          内网生产环境的域名访问在推广初期,从无到有,看似简单的域名请求,需要增加到 JDK、操作系统等环节的访问,这些环节缓存开启情况不同,要实施域名访问需重点考虑是否要开启缓存,缓存时间配置为多少合适。

    1.5.4.1 是否开启缓存的考虑

          生产系统之间的交互有别于终端与系统之间的交互,生产系统交互频次高、时延要求高,若不开启缓存会在哪些方面有所影响?

    链接建立影响

          经过测试,Weblogic 和 Tomcat 中间件建立一个链接分别会发起 2 个 DNS 请求,且要求 2 个请求都成功后方可建立链接,此处行为一致,但中间件会部署在某个操作系统上,由于 Suse 和 AIX 操作系统的超时重传机制不同,当网络出现丢包时,两类中间件行为结果不一样,若开启缓存,有一个 DNS 请求成功了就会被缓存,就能成功建立链接,若不开启缓存,面对超时时间不同、重传次数不同的问题,就很难评估何时能正常建立链接,出现问题时就很难分析业务影响和业务恢复时间,为排障增加了难度。

    时延影响

          大部分系统为提高利用率以及实现高可靠性,应用采用双中心双活部署。在大二层的部署架构下,存在大量跨同城中心的访问流量,每一次跨中心访问都会增加一次时延,对于高频交互系统,在不开启缓存的情况下每次交互都会发起一次 DNS 请求,就会额外增加时延,会对系统带来访问缓慢的问题,严重时可能会影响交易。

          生产系统计划使用域名访问时,每笔交易对于访问 DNS 增加的时延带来的影响很难进行评估以及精准的测试影响结果,为避免通过域名访问增加的时延对生产系统带来影响,考虑开启具备缓存功能环节的缓存,但若仅针对时延要求高的系统开启缓存,那么生产环境就会存在不同的配置标准,又增加了运维的复杂性,因此,从运维规范、统一的角度考虑开启缓存。缓存功能开启了,缓存时间设置多长才能既满足快速访问业务又满足缓存及时失效的需求?

     

    1.5.4.2 缓存时间考虑

          生产系统部署环境涉及的操作系统、中间件、系统程序等环节都存在缓存功能,导致 DNS 配置的域名缓存值对于业务系统的时间影响不可控,就无法真实了解缓存时间对业务的影响,以及更改域名对应的地址后业务恢复时间也无法掌握。要想解决生产系统面临的类型多和层级多的问题,可以从统一标准入手:

    参考唯一 TTL 值

          统一开启各节点缓存器认可 DNS 服务器配置的 TTL 值,参考标准唯一,超时时间明确;对于无法参考 DNS TTL 值的环节,统一配置为与 DNS TTL 相同的超时时间

    统一操作系统超时重传机制

          统一不同操作系统超时重传时间间隔、重传次数等参数

    规范开发

         部分用特殊语言编写的业务系统有自己独有的缓存规则,需要规范开发规则,可调整遵循 DNS 规则

     

    1.5.4.3 如何设置 TTL 值

          缓存超时间(TTL)是缓存技术中的一个重要参数,对缓存效果起着决定性的作用。TTL 时间设置较长,域名就能缓存更长时间,用户就能更快实现访问,TTL 时间设置较短,域名就更快超时,用户就需要等待域名解析才能正常访问。因此,TTL 时间设置的长短将直接影响用户的体验效果。TTL 值设置大小需要根据业务特性、业务环境、DNS 服务器性能等因素综合考虑,针对不同应用场景的缓存值设置规则可参考如下建议:

    互联网环境

          互联网环境由于运营商 Local DNS 缓存服务器的存在,具有不可控性,因此不适宜配置较长的缓存时间,建议参考 DNS 性能配置较小缓存值,例如设置为分钟级。

    内网终端环境

          内网终端环境相对可控,且大部分业务都是通过标准模式虚服务方式对外提供服务,域名变更概率较小,为减少终端访问频率,缓存值建议配置稍长时间,例如设置为小时级。

    内网生产环境

          生产系统变更的概率较大,且若缓存更新不及时可能会带来重大的业务影响,因此生产系统不适宜配置较长的缓存超时时间,建议参考 DNS 性能配置为秒到分钟级。

     

    2、CDN 缓存

    2.1 什么是CDN

    全称 Content Delivery Network,即内容分发网络。

    摘录一个形象的比喻,来理解CDN是什么。

    10年前,还没有火车票代售点一说,12306.cn更是无从说起。那时候火车票还只能在火车站的售票大厅购买,而我所在的小县城并不通火车,火车票都要去市里的火车站购买,而从我家到县城再到市里,来回就是4个小时车程,简直就是浪费生命。后来就好了,小县城里出现了火车票代售点,甚至乡镇上也有了代售点,可以直接在代售点购买火车票,方便了不少,全市人民再也不用在一个点苦逼的排队买票了。

    简单的理解CDN就是这些代售点(缓存服务器)的承包商,他为买票者提供了便利,帮助他们在最近的地方(最近的CDN节点)用最短的时间(最短的请求时间)买到票(拿到资源),这样去火车站售票大厅排队的人也就少了。也就减轻了售票大厅的压力(起到分流作用,减轻服务器负载压力)。

    用户在浏览网站的时候,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求,这样海南移动用户的请求就不会千里迢迢跑到北京电信机房的服务器(假设源站部署在北京电信机房)上了。

    2.2 CDN缓存

    关于CDN缓存,在浏览器本地缓存失效后,浏览器会向CDN边缘节点发起请求。类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。CDN边缘节点缓存策略因服务商不同而不同,但一般都会遵循http标准协议,通过http响应头中的

    Cache-control: max-age //后面会提到

    的字段来设置CDN边缘节点数据缓存时间。

    当浏览器向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点就会向服务器发出回源请求,从服务器拉取最新数据,更新本地缓存,并将最新数据返回给客户端。 CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。

    2.3 CDN 优势

    1. CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低。
    2. 大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源服务器的负载。

      戳此处详细了解CDN工作过程

     

    3、浏览器缓存(http缓存)

    对着这张图先发呆30秒~
    image

    3.1 什么是浏览器缓存

    image

    简单来说,浏览器缓存其实就是浏览器保存通过HTTP获取的所有资源,是浏览器将网络资源存储在本地的一种行为。

    3.2 缓存的资源去哪里了?

    你可能会有疑问,浏览器存储了资源,那它把资源存储在哪里呢?

    memory cache

    MemoryCache顾名思义,就是将资源缓存到内存中,等待下次访问时不需要重新下载资源,而直接从内存中获取。Webkit早已支持memoryCache。
    目前Webkit资源分成两类,一类是主资源,比如HTML页面,或者下载项,一类是派生资源,比如HTML页面中内嵌的图片或者脚本链接,分别对应代码中两个类:MainResourceLoader和SubresourceLoader。虽然Webkit支持memoryCache,但是也只是针对派生资源,它对应的类为CachedResource,用于保存原始数据(比如CSS,JS等),以及解码过的图片数据。

    disk cache

    DiskCache顾名思义,就是将资源缓存到磁盘中,等待下次访问时不需要重新下载资源,而直接从磁盘中获取,它的直接操作对象为CurlCacheManager。
    • |memory cache | disk cache
    相同点只能存储一些派生类资源文件只能存储一些派生类资源文件
    不同点退出进程时数据会被清除退出进程时数据不会被清除
    存储资源一般脚本、字体、图片会存在内存当中一般非脚本会存在内存当中,如css等

    因为CSS文件加载一次就可渲染出来,我们不会频繁读取它,所以它不适合缓存到内存中,但是js之类的脚本却随时可能会执行,如果脚本在磁盘当中,我们在执行脚本的时候需要从磁盘取到内存中来,这样IO开销就很大了,有可能导致浏览器失去响应。

    三级缓存原理 (访问缓存优先级)

    1. 先在内存中查找,如果有,直接加载。
    2. 如果内存中不存在,则在硬盘中查找,如果有直接加载。
    3. 如果硬盘中也没有,那么就进行网络请求。
    4. 请求获取的资源缓存到硬盘和内存。

    3.3 浏览器缓存的优点

    1.减少了冗余的数据传输

    2.减少了服务器的负担,大大提升了网站的性能

    3.加快了客户端加载网页的速度

    3.4 浏览器缓存的分类

    1. 强缓存
    2. 协商缓存

    浏览器再向服务器请求资源时,首先判断是否命中强缓存,再判断是否命中协商缓存!

    3.4.1 强缓存

    浏览器在加载资源时,会先根据本地缓存资源的 header 中的信息判断是否命中强缓存,如果命中则直接使用缓存中的资源不会再向服务器发送请求。

    这里的 header 中的信息指的是 expires 和 cahe-control.

    3.4.1.1 Expires:

    该字段是 http1.0 时的规范,它的值为一个绝对时间的 GMT 格式的时间字符串,比如 Expires:Mon,18 Oct 2066 23:59:59 GMT。这个时间代表着这个资源的失效时间,在此时间之前,即命中缓存。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当服务器与客户端时间偏差较大时,就会导致缓存混乱。

    3.4.1.2 Cache-Control:

    Cache-Control 是 http1.1 时出现的 header 信息,主要是利用该字段的 max-age 值来进行判断,它是一个相对时间,例如 Cache-Control:max-age=3600,代表着资源的有效期是 3600 秒。cache-control 除了该字段外,还有下面几个比较常用的设置值:

    no-cache:需要进行协商缓存,发送请求到服务器确认是否使用缓存。

    no-store:禁止使用缓存,每一次都要重新请求数据。

    public:可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器。

    private:只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。

    Cache-Control 与 Expires 可以在服务端配置同时启用,同时启用的时候 Cache-Control 优先级高。

    3.4.2 协商缓存

    当强缓存没有命中的时候,浏览器会发送一个请求到服务器,服务器根据 header 中的部分信息来判断是否命中缓存。如果命中,则返回 304 ,告诉浏览器资源未更新,可使用本地的缓存。

    这里的 header 中的信息指的是 Last-Modify/If-Modify-Since 和 ETag/If-None-Match.

    3.4.2.1 Last-Modify/If-Modify-Since:

    浏览器第一次请求一个资源的时候,服务器返回的 header 中会加上 Last-Modify,Last-modify 是一个时间标识该资源的最后修改时间。

    当浏览器再次请求该资源时,request 的请求头中会包含 If-Modify-Since,该值为缓存之前返回的 Last-Modify。服务器收到 If-Modify-Since 后,根据资源的最后修改时间判断是否命中缓存。

    如果命中缓存,则返回 304,并且不会返回资源内容,并且不会返回 Last-Modify。

    缺点:

    短时间内资源发生了改变,Last-Modified 并不会发生变化。

    周期性变化。如果这个资源在一个周期内修改回原来的样子了,我们认为是可以使用缓存的,但是 Last-Modified 可不这样认为,因此便有了 ETag。

    3.4.2.2 ETag/If-None-Match:

    与 Last-Modify/If-Modify-Since 不同的是,Etag/If-None-Match 返回的是一个校验码。ETag 可以保证每一个资源是唯一的,资源变化都会导致 ETag 变化。服务器根据浏览器上送的 If-None-Match 值来判断是否命中缓存。

    与 Last-Modified 不一样的是,当服务器返回 304 Not Modified 的响应时,由于 ETag 重新生成过,response header 中还会把这个 ETag 返回,即使这个 ETag 跟之前的没有变化。

    Last-Modified 与 ETag 是可以一起使用的,服务器会优先验证 ETag,一致的情况下,才会继续比对 Last-Modified,最后才决定是否返回 304。

     

    3.4.3 浏览器缓存总结

    当浏览器再次访问一个已经访问过的资源时,它会这样做:

    1.看看是否命中强缓存,如果命中,就直接使用缓存了。

    2.如果没有命中强缓存,就发请求到服务器检查是否命中协商缓存。

    3.如果命中协商缓存,服务器会返回 304 告诉浏览器使用本地缓存。

    4.否则,返回最新的资源。

     

    4 清除缓存

    4.1 浏览器清除缓存

          通过设置hosts文件可以强制指定域名对应的IP,当修改hosts文件,想要浏览器生效,最直接的方法关闭浏览器后重新开启;如果不想重启浏览器,只需要清空浏览器的DNS缓存即可。清空DNS缓存在chrome、firefox下很容易做到。具体操作如下:

    chrome:

          在浏览器的地址栏中输入 chrome://net-internals/#dns 并回车,该页面会显示当前所有DNS缓存,通过点击“Clear host cache”,可以清空所有DNS缓存。有时候此方法可能不能立刻生效,可以使用另外一个设置,在地址栏中输入 chrome://settings/ 并回车,通过搜索“预测网络操作”找到配置项“预测网络操作,以提高网页加载速度”,去掉前面的勾即可。

    firefox:

          在地址栏中 about:config 并回车,可能会出现一个警告信息,直接点击按钮进入,会出现firefox的所有配置信息,通过搜索dns进行过滤,可以看到一项名为 network.dnsCacheExpirationGracePeriod 项,它对应的值就是DNS缓存的时间,双击此项,会出现修改的提示框,填入 0 (不缓存DNS)即可

     

    4.2 如何清除缓存

    各大浏览器默认开启了DNS缓存功能,所以在先访问有个不存在域名后,再把该域名添加到本地hosts文件指向本地后,用该浏览器访问依然会提示域名不存在。。。

    4.2.1 Firefox解决方式:

    Firefox有dns缓存功能,但是Firefox默认缓存时间只有1分钟,可以通过修改该默认值加快DNS解析速度,方法如下:

    •       打开一个新的窗口,地址栏输 入 about:config,回车,进入设置界面。然后搜索 network.dnsCacheExpiration ,把原来的60改成 6000(表示缓存6000秒),再搜索network.dnsCacheEntries 把默认的20改成1000(表示缓存1000条)。如果没 有上面两个项目,新建它们即可,新建条目类型为整数型。 当然也可以按照需要设置成其它的值。

    但是dns缓存太久了也会出问题,比如有的网站ip换了,就无法访问了。
    针对这样的问题,还可以安装一个 firefox 插件来开启或者 关闭dns cache功能,https://addons.mozilla.org/zh-CN/firefox/addon/5914 。

    4.2.2 IE解决方式:

    禁用DNS缓存的方法,将下面内容保存为注册表文件,在运行写入注册表:

    Windows Registry Editor Version 5.00

    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
    "DnsCacheEnabled"=dword:00000000
    "DnsCacheTimeout"=dword:00000000
    "ServerInfoTimeOut"=dword:00000000

    写入注册表以后IE将不再缓存DNS,我们对hosts便会立即生效,无需再重启浏览器。

    如果需要恢复IE的DNS缓存,只需清楚我们之前写入的注册表内容。跟上面的方法一样:

    Windows Registry Editor Version 5.00

    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
    "DnsCacheEnabled"=-
    "DnsCacheTimeout"=-
    "ServerInfoTimeOut"=-

    4.2.3 Chrome浏览器:

    为了加快访问速度,Google Chrome浏览器采用了预提DNS记录,在本地建立DNS缓存的方法,加快网站的连接速度。你在谷歌Chrome浏览器的地址栏中输入about:DNS,回车,就可以看到本地的DNS缓存。

    firefox下有个DNS Flusher插件,但没有chrome版本,其实在chrome下清除DNS缓存非常简单:
    1、用chrome打开:chrome://net-internals/#dns
    2、点击上面的“clean host cache”

    也可以清空在工具中选择清空Cache,这样DNS cache会一同清空。

     

    4.2.4 系统清除DNS缓存

    微软windows下如何清空dns

     在微软windows下,你可以用命令ipconfig /flushd ns来清空dns 缓存内容。

    你也可以用命令ipconfig /displaydns 来查看dns缓存内容。

     

    Mac OSX下如何清空dns缓存
    在Mac OSX中,你可以用这个命令lookupd -flushcache 来清空保留的缓存。
    bash-2.05a$ lookupd -flushcache
     

    Linux 下如何清空dns缓存

    在linux中,nscd进程负责管理DNS缓存。
    要清空DNS缓存,重启nscd守护进程就行了。
    要重启nscd进程,使用命令(不带引号)'/etc/rc.d/init.d/nscd restart '

     

    4.3 本修改本地hosts文件,浏览器不会立即生效

    经常做Web开发的工程师,都会遇到需要将某个域名绑定到特定IP上,进行测试的情况。大家一般都会用修改hosts文件的方式来解决,但是经常也会遇到修改hosts不生效的情况,而且有时生效,有时不生效的情况也有发生,这到底是为什么呢?

    起:DNS缓存机制

    关于DNS缓存的机制,有一篇非常详细的文章What really happens when you navigate to a URL

    简单来说,一条域名的DNS记录会在本地有两种缓存:浏览器缓存和操作系统(OS)缓存。在浏览器中访问的时候,会优先访问浏览器缓存,如果未命中则访问OS缓存,最后再访问DNS服务器(一般是ISP提供),然后DNS服务器会递归式的查找域名记录,然后返回。

    DNS记录会有一个ttl值(time to live),单位是秒,意思是这个记录最大有效期是多少。经过实验,OS缓存会参考ttl值,但是不完全等于ttl值,而浏览器DNS缓存的时间跟ttl值无关,每种浏览器都使用一个固定值
    这里有一篇文章,做过详细的测试Why Web Browser DNS Caching Can Be A Bad Thing

     

    后来我也做过测试,Mac下Chrome(23.0.1271.101)的DNS缓存时间是1分钟。Safari下DNS缓存时间大约为10秒。

    解:hosts文件修改的原理

    那么在修改hosts文件之后,发生了什么事情呢?这里不妨先提提Chrome下的一个工具:chrome://net-internals/#dns。这里列出了目前系统中的DNS缓存和Chrome中使用的情况。通过这个工具,可以看到:

    1**在修改hosts文件后,所有OS中DNS缓存会被清空,而浏览器缓存则不发生变化。**

    网上盛传chrome://net-internals/#dns下的"Clear Host Cache"可以清空DNS缓存,这里博主做了一个测试,这里清空的仅仅是OS的缓存,而并非浏览器DNS缓存。当某条DNS记录显示"Expired"的时候,才表示浏览器DNS缓存已经被清除。所以使用Clear Host Cache其实是没有用的。

    那么回到最初的问题上来,为什么修改hosts文件之后,有时会立刻生效,有时却一直不生效呢?其实原因很简单,这是因为浏览器缓存的过期时间,是从某个域名上次查询DNS记录开始计算的。

    例如:我00秒的时候使用chrome访问过www.google.com.hk,此时浏览器DNS缓存产生,然后我修改了hosts文件,将 www.google.com.hk指向本地127.0.0.1,然后在05秒的时候尝试再次访问这个地址,因为浏览器DNS缓存未过期,所以hosts 修改无法体现出来。

    另一种情况下,我很久都没有访问www.baidu.com了,然后我修改了hosts文件,将其指向127.0.0.1,这时因为浏览器没有DNS缓存,所以会查询操作系统中的DNS缓存,结果此时hosts文件生效!

    前面也提到,Safari的浏览器DNS缓存时间大约为10秒,所以一般调试程序的时候,很多人都习惯修改hosts后,用Safari来调试,因为大部分情况下,修改hosts之后,浏览器DNS缓存已经失效了。

    那么怎么主动清除浏览器DNS缓存呢?博主目前也没有找到办法,测试过Chrome下的“清除缓存”选项,发现没有起到期望的效果。

    那么,就请在修改hosts之后,耐下心来,稍等几十秒吧

     

    5 JVM DNS 缓存

    5.1 介绍

    域名解析并非一个简单的过程,其解析结果可能会被层层缓存,如浏览器 DNS 缓存、操作系统 DNS 缓存、ISP 的 DNS缓存,容易被忽略的是 JVM 本身也会对 DNS 进行缓存。

    JVM 的 DNS 缓存可以通过以下参数进行配置:

    • networkaddress.cache.ttl
    • sun.net.inetaddr.ttl
    1. 如果开启了 SecurityManager,优先从 ${java.home}/jre/lib/security/java.security 中读取参数 networkaddress.cache.ttl,单位为秒。
    2. 如果未读取到,则会读取启动参数 sun.net.inetaddr.ttl 作为缓存 ttl.
    3. 如果以上参数均未读取到,并且未开启 SecurityManager,则会使用默认值 30s.
    4. 否则使用初始值 -1,表示永久生效。

    以上逻辑可以在 InetAddressCachePolicy.class 中体现,反编译后,有如下代码

    static {
            Integer var0 = (Integer)AccessController.doPrivileged(new PrivilegedAction<Integer>() {
                public Integer run() {
                    String var1;
                    
                    // 优先读取 networkaddress.cache.ttl
                    try {
                        var1 = Security.getProperty("networkaddress.cache.ttl");
                        if (var1 != null) {
                            return Integer.valueOf(var1);
                        }
                    } catch (NumberFormatException var3) {
                        ;
                    }
                        
                   // 未读取到,则读取启动参数 sun.net.inetaddr.ttl
                    try {
                        var1 = System.getProperty("sun.net.inetaddr.ttl");
                        if (var1 != null) {
                            return Integer.decode(var1);
                        }
                    } catch (NumberFormatException var2) {
                        ;
                    }
    
                    return null;
                }
            });
            if (var0 != null) {
                cachePolicy = var0.intValue();
                if (cachePolicy < 0) {
                    cachePolicy = -1;
                }
    
                propertySet = true;
            } else if (System.getSecurityManager() == null) {
                // 如果未启用 SecurityManager,使用默认值 30
                cachePolicy = 30;
            }
    

    其中 cachePolicy 初始值为 -1,表示缓存永不失效。

    我们通过以下代码对 DNS 缓存参数进行测试:

    public class HostProcessor implements Runnable {
    
        private int count = 1;
    
        /**
         * 每秒解析1次 www.baidu.com 的 IP
         */
        @Override
        public void run() {
            while (true) {
                System.out.println(count);
                printIp("www.baidu.com");
    
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                count = count + 1;
                System.out.print("\r\n");
            }
        }
    
        /**
         * 解析并打印 IP
         */
        private void printIp(String host) {
            InetAddress address = null;
            try {
                address = Inet4Address.getByName(host);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
    
            if (address == null) {
                return;
            }
    
            System.out.println(address.getHostAddress());
            System.out.println(address.getHostName());
        }
    
        public static void main(String[] args) {
            Thread thread = new Thread(new HostProcessor());
            thread.start();
        }
    }
    

    5.2 networkaddress.cache.ttl 参数测试

    首先修改 java.security 中的 networkaddress.cache.ttl 配置,改为以下值:

    networkaddress.cache.ttl=15
    

    启动程序,开始打印域名对应 IP 后,立刻修改 /etc/hosts,将 www.baidu.com 指向到陌生 IP:

    47.95.164.112   www.baidu.com
    

    观察控制台输出,有如下结果:

     

    在 15 秒后,对 host 映射的修改才反应出来

    5.3 sun.net.inetaddr.ttl 参数测试

    注释掉 java.security 中的 networkaddress.cache.ttl 配置,如下:

    #networkaddress.cache.ttl=15
    

    添加程序启动参数:

    -Dsun.net.inetaddr.ttl=10
    

    同样启动程序后,将原先 host 文件的修改回退,观察到如下输出:

    在 10 秒后,对 host 映射的修改才反应出来

    除了解析成功的结果,JVM 也会缓存解析失败的结果,可以通过下列参数配置:

    • networkaddress.cache.negative.ttl
    • sun.net.inetaddr.negative.ttl
      这里不展开介绍

     

    5. 参考:

    https://segmentfault.com/a/1190000017962411

    https://www.infoq.cn/article/8qmbxvabn3ec8vt5itxw

    https://www.cnblogs.com/tonykan/p/3500332.html

    https://www.jianshu.com/p/048e8bd3ea46

     

    展开全文
  • CDN缓存

    千次阅读 2015-07-17 14:34:15
    CDN缓存那些事 CDN是什么? 谈到CDN的作用,可以用8年买火车票的经历来形象比喻: 8年前,还没有火车票代售点一说,12306.cn更是无从说起。那时候火车票还只能在火车站的售票大厅购买,而我所...
    CDN缓存那些事
    



    CDN是什么?

    谈到CDN的作用,可以用8年买火车票的经历来形象比喻:

    8年前,还没有火车票代售点一说,12306.cn更是无从说起。那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火车,火车票都要去市里的火车站购买,而从县城到市里,来回就是4个小时车程,简直就是浪费生命。后来就好了,小县城里出现了火车票代售点,可以直接在代售点购买火车,方便了不少,全市人民再也不用在一个点苦逼的排队买票了。

    CDN就可以理解为分布在每个县城的火车票代售点,用户在浏览网站的时候,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求,这样海南移动用户的请求就不会千里迢迢跑到北京电信机房的服务器(假设源站部署在北京电信机房)上了。

    CDN的优势很明显:(1)CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;(2)大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。

    缓存是什么? 

    这里不深究CDN背后高大上的架构,也不讨论CDN如何做到全局流量调度策略,本文着重讨论在有了CDN后,数据是如何被缓存的。缓存是一个到处都存在的用空间换时间的例子。通过使用多余的空间,我们能够获取更快的速度。
    首先,看看没有网站没有接入CDN时,用户浏览器与服务器是如何交互的:
    q111.png

    用户在浏览网站的时候,浏览器能够在本地保存网站中的图片或者其他文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了下载量意味着提高了页面加载的速度。
    如果中间加上一层CDN,那么用户浏览器与服务器的交互如下:
    q222.png
             
    客户端浏览器先检查是否有本地缓存是否过期,如果过期,则向CDN边缘节点发起请求,CDN边缘节点会检测用户请求数据的缓存是否过期,如果没有过期,则直接响应用户请求,此时一个完成http请求结束;如果数据已经过期,那么CDN还需要向源站发出回源请求(back to the source request),来拉取最新的数据。CDN的典型拓扑图如下:

    q333.png

    可以看到,在存在CDN的场景下,数据经历了客户端(浏览器)缓存和CDN边缘节点缓存两个阶段,下面分别对这两个阶段的缓存进行详细的剖析

    客户端(浏览器)缓存

    客户端缓存的缺点 

    客户端缓存减少了的服务器请求,避免了文件重复加载,显著地提升了用户地方。但是当网站发生了更新的时候(如替换了css、js以及图片文件),浏览器本地仍保存着旧版本的文件,从而导致无法预料后果。

    曾几何时,一个页面加载出来,页面各元素位置乱飘,按钮点击失效,前端GG都会习惯性地问一句:“缓存清了没?”,然后Ctrl+F5       ,Everything is OK。但有些时候,如果我们是简单地在浏览器地址栏中敲一个回车,或者是仅仅按F5刷新,问题依然没有解决,你可知道这三种不同的操作方式,决定浏览器不同的刷新缓存策略?

    浏览器如何来确定使用本地文件还是使用服务器上的新文件?下面来介绍几种判断的方法。

    浏览器缓存策略

    Expires 

    Expires:Sat, 24 Jan 2015 20:30:54 GMT


    q444.png
    如果http响应报文中设置了Expires,在Expires过期之前,我们就避免了和服务器之间的连接。此时,浏览器无需想浏览器发出请求,只需要自己判断手中的材料是否过期就可以了,完全不需要增加服务器的负担。

    Cache-control: max-age
    q555.png
    Expires的方法很好,但是我们每次都得算一个精确的时间。max-age 标签可以让我们更加容易的处理过期时间。我们只需要说,这份资料你只能用一个星期就可以了。

    Max-age 使用秒来计量,如:
    Cache-Control:max-age=645672
    指定页面645672秒(7.47天)后过期。

    Last-Modified

    服务器为了通知浏览器当前文件的版本,会发送一个上次修改时间的标签,例如:
    Last-Modified:Tue, 06 Jan 2015 08:26:32 GMT
    q666.png
    这样浏览器就知道他收到的这个文件创建时间,在后续的请求中,浏览器会按照下面的规则进行验证:
    1.  浏览器:Hey,我需要jquery.min.js这个文件,如果是在 Tue, 06 Jan 2015 08:26:32 GMT 之后修改过的,请发给我。
    2.  服务器:(检查文件的修改时间)
    3.  服务器:Hey,这个文件在那个时间之后没有被修改过,你已经有最新的版本了。
    4.  浏览器:太好了,那我就显示给用户了。
    在这种情况下,服务器仅仅返回了一个304的响应头,减少了响应的数据量,提高了响应的速度。关于304响应,请参考:
    下图是按F5刷新页面后,页面返回304响应头。
    q777.png

    ETag
     

    通常情况下,通过修改时间来比较文件是可行的。但是在一些特殊情况,例如服务器的时钟发生了错误,服务器时钟进行修改,夏时制DST到来后服务器时间没有及时更新,这些都会引起通过修改时间比较文件版本的问题。

    ETag可以用来解决这种问题。ETag是一个文件的唯一标志符。就像一个哈希或者指纹,每个文件都有一个单独的标志,只要这个文件发生了改变,这个标志就会发生变化。

    服务器返回ETag标签:
    ETag:"39001d-1762a-50bf790757e00"
    q888.png
    接下来的访问顺序如下所示:
    1. 浏览器:Hey,我需要jquery.min.js这个文件,有没有不匹配"39001d-1762a-50bf790757e00"这个串的
    2. 服务器:(检查ETag…)
    3. 服务器:Hey,我这里的版本也是"39001d-1762a-50bf790757e00",你已经是最新的版本了
    4. 浏览器:好,那就可以使用本地缓存了
    如同 Last-modified 一样,ETag 解决了文件版本比较的问题。只不过 ETag 的级别比 Last-Modified 高一些。

    额外的标签

    缓存标签永远不会停止工作,但是有时候我们需要对已经缓存的内容进行一些控制。
    l  Cache-control: public 表示缓存的版本可以被代理服务器或者其他中间服务器识别。
    l  Cache-control: private 意味着这个文件对不同的用户是不同的。只有用户自己的浏览器能够进行缓存,公共的代理服务器不允许缓存。
    l  Cache-control: no-cache 意味着文件的内容不应当被缓存。这在搜索或者翻页结果中非常有用,因为同样的URL,对应的内容会发生变化。
    q999.png

    浏览器缓存刷新
     

    1.  
    在地址栏中输入网址后按回车或点击转到按钮
    浏览器以最少的请求来获取网页的数据,浏览器会对所有没有过期的内容直接使用本地缓存,从而减少了对浏览器的请求。所以,Expires,max-age标记只对这种方式有效。

    2.  按F5或浏览器刷新按钮
    浏览器会在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存,它能够让 Last-Modified、ETag发挥效果,但是对Expires无效。

    3.  按Ctrl+F5或按Ctrl并点击刷新按钮
    这种方式就是强制刷新,总会发起一个全新的请求,不使用任何缓存。

    CDN缓存 

    浏览器本地缓存失效后,浏览器会向CDN边缘节点发起请求。类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。

    CDN缓存的缺点
     

    CDN的分流作用不仅减少了用户的访问延时,也减少的源站的负载。但其缺点也很明显:当网站更新时,如果CDN节点上数据没有及时更新,即便用户再浏览器使用Ctrl +F5的方式使浏览器端的缓存失效,也会因为CDN边缘节点没有同步最新数据而导致用户访问异常。

    CDN缓存策略 

    CDN边缘节点缓存策略因服务商不同而不同,但一般都会遵循http标准协议,通过http响应头中的Cache-control: max-age的字段来设置CDN边缘节点数据缓存时间。

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

    CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。

    CDN缓存时间会对“回源率”产生直接的影响。若CDN缓存时间较短,CDN边缘节点上的数据会经常失效,导致频繁回源,增加了源站的负载,同时也增大的访问延时;若CDN缓存时间太长,会带来数据更新时间慢的问题。开发者需要增对特定的业务,来做特定的数据缓存时间管理。

    CDN缓存刷新

    CDN边缘节点对开发者是透明的,相比于浏览器Ctrl+F5的强制刷新来使浏览器本地缓存失效,开发者可以通过CDN服务商提供的“刷新缓存”接口来达到清理CDN边缘节点缓存的目的。这样开发者在更新数据后,可以使用“刷新缓存”功能来强制CDN节点上的数据缓存过期,保证客户端在访问时,拉取到最新的数据。
    展开全文
  • http缓存与cdn缓存配置指南

    千次阅读 2018-11-08 08:33:50
    合理的http缓存与cdn缓存配置可以起到减轻服务器压力,缓解网络瓶颈,提升用户体验等作用,不当的缓存配置却会导致资源无法及时更新,用户体验差异,甚至流程出错等问题。本文主要讲解http缓存与cdn缓存的原理和配置...
  • CDN】处理 cdn 缓存和 前端缓存

    千次阅读 2020-08-09 17:26:05
    一、cdn 缓存问题 问题: cdn 缓存问题是由于 cdn 节点缓存了页面文件,导致用户直接在 cdn 节点访问了对应文件, 而不是通过节点,这就导致用户可能使用旧版页面,发送旧的请求到服务器,从而引发错误。 解决: ...
  • HTTP: CDN缓存机制

    2021-01-06 15:25:39
    CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上,用于确保快速可靠地分发静态内容,这些内容可以缓存,最适合在网速庞大...
  • 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 感谢...
  • Linux—CDN缓存系统

    千次阅读 2019-02-20 13:44:15
    varnish是一款高性能的开源HTTP加速器,具有反向代理与缓存的功能 varnish 工作原理图: vcl处理过程 处理过程大致分为如下几个步骤: (1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求...
  • CDN缓存是什么?

    千次阅读 2016-11-16 17:57:18
    CDN是什么?  关于CDN是什么,此前网友详细介绍过。  CDN是Content Delivery Network的简称,即“内容分发网络”的意思。一般我们所说的CDN加速,一般是指网站加速或者用户下载资源加速。  可能这种专业...
  • cdn 缓存现象

    2020-08-09 14:24:36
    如图所示,我在阿里云对象存储OSS系统中相应的路径上传了截图中的文件内容,过了一会儿发现这个monaco-editor源码文件,不能直接使用,能直接使用的是另外一个打包过的文件,...https://cdn.test.cn/monaco/langua..
  • CDN缓存的理解

    2020-09-03 12:36:01
    CDN缓存的理解 CDN即内容分发网络Content Delivery Network,CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向...
  • cdn缓存有什么用途?

    2020-10-20 11:14:12
    但是可能大家在使用CDN的时候,也会发现有CDN缓存,不少人都不太清楚cdn缓存什么意思,不知道这样的一个缓存到底有什么样的作用。其实只要是使用到CDN,必须要对这样的一款服务器有所了解,这样才能够知道其基础的...
  • CDN缓存小结

    万次阅读 2017-10-30 16:56:30
    首先,cdn可以理解为一个普通缓存,如代理缓存或者说边缘缓存,即便不关心用户的具体地理位置,也应该考虑使用cdn的代理缓存来提高用户体验。 简单而言,代理缓存缓存你网站的一些页面,通过缓存来传输静态内容...
  • cdn缓存

    千次阅读 2015-07-09 23:37:54
    客户端浏览器先检查是否有本地缓存是否过期,如果过期,则向CDN边缘节点发起请求,CDN边缘节点会检测用户请求数据的缓存是否过期,如果没有过期,则直接响应用户请求,此时一个完成http请求结束;如果数据已经过期,...
  • cdn缓存及缓存的清理

    万次阅读 2019-07-19 10:33:07
    2.确认CDN群组 3.写入清除目标(.*表示当前目录下所有缓存,/index.html表示清除当前目录下index.html的缓存) 4.查看推送结果 5.推送成功后再次访问www.westos.org发现并没有命中 X-Cache: MISS from ...
  • CDN缓存结点

    2019-12-02 13:47:41
    CDN加速意思就是在用户和我们的服务器之间加一个缓存机制,通过这个缓存机制动态获取IP地址根据地理位置,让用户到最近的服务器访问。 那么CDN是个啥?全称Content Delivery Network即内容分发网络。 CDN是一组分布...
  • 内存缓存 用于存放热点数据,比如配置、预置热点数据,如果是可变数据,在对一致性要求不高时使用。 定时任务更新,对于实时性要求不高可采用 订阅通知更新,实时性要求高可采用 需要评估内存资源消耗,和淘汰...
  • 在用户到达我们的网站之前已经缓存了文件的可能性是巨大的。 使用CDN的唯一问题是,它不受控制。 更具体地说,如果CDN服务器已关闭怎么办? 什么样的恶梦! 数以千计甚至数百万个网站可能会受到伤害……但您的网站...
  • 案例:Web服务器:域名www.abc.com IP:192.168.21.129 电信单线路接入访问用户:电信宽带用户、移动宽带用户出现问题:电信用户打开www.abc.com正常,移动用户...配置反向代理搭建CDN缓存服务器安装前准备:1、关闭SE
  • dns缓存和cdn缓存

    2020-04-02 09:35:09
    CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应...
  • 这里我只简单的说一下这是什么,想具体了解的话,直接百度CDN缓存就有详细说明了; CDN缓存属于服务器缓存,相当于代理。其次还有HTTP缓存,属于浏览器缓存,相当于商家; 当用户发起请求时,先在浏览器找缓存,...
  • 浏览器与cdn缓存

    万次阅读 2016-05-24 15:41:29
    前端缓存分为浏览器缓存和cdn缓存   关于是否缓存,是浏览器缓存还是CDN缓存,缓存保留多长时间,由cache-control控制 请求: 响应: 特别说明:  Cache-control: public 表示缓存的版本可以被代理服务器或者...
  • CDN缓存原理和介绍

    千次阅读 2019-07-10 16:25:17
    1.CDN是个啥玩意?  Content Delivery Network,即内容分发网络  各地部署多套静态存储服务,本质上是空间换时间  自动选择最近的节点内容,不存在再请求原始服务器  适合存储更新很少的静态内容,文件更新慢...
  • 【缓存】-CDN缓存

    千次阅读 2018-08-14 20:49:27
    简介 CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新...CDN缓存 1.CDN加速原理 CDN服务商可能在多个地方建有服务器,通过域名解析分配最近的服务器作出响应。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,953
精华内容 31,181
关键字:

cdn缓存