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 节点的缓存过期之后,节点回源拉取源服务器上最新的文件)
 
 

CDN和浏览器缓存的更多相关文章

  1. CDN、浏览器缓存

    CDN是什么? 谈到CDN的作用,可以用8年买火车票的经历来形象比喻: 8年前,还没有火车票代售点一说,12306.cn更是无从说起.那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火 ...

  2. WEB请求过程(http解析,浏览器缓存机制,域名解析,cdn分发)

    概述 发起一个http请求的过程就是建立一个socket通信的过程. 我们可以模仿浏览器发起http请求,譬如用httpclient工具包,curl命令等方式. curl "http://w ...

  3. 聊聊 CDN 缓存与浏览器缓存

    CDN 是互联网上内容分发的重要一环.无论您之前是否了解过 CDN,其实它已经在您的日常生活中发挥作用了.比如您正在淘宝挑选心仪的商品,或者在观看一段令人捧腹的视频,以及您正在阅读的这篇文章,这些资源 ...

  4. 浏览器缓存详解:expires,cache-control,last-modified,etag详细说明

    最近在对CDN进行优化,对浏览器缓存深入研究了一下,记录一下,方便后来者 画了一个草图: 每个状态的详细说明如下: 1.Last-Modified 在浏览器第一次请求某一个URL时,服务器端的返回状态 ...

  5. cdn与http缓存

    http缓存与cdn相关技术   摘要:最近要做这个主题的组内分享,所以准备了一个星期,查了比较多的资料.准备的过程虽然很烦很耗时间,不过因为需要查很多的资料,因此整个过程下来,对这方面的知识影响更加 ...

  6. 缓存系列之一:buffer、cache与浏览器缓存

    缓存系列之一:buffer.cache与浏览器缓存 一:缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如CPU的一级.二级缓存是保 ...

  7. <转>浏览器缓存机制

    本篇博客转载自github,原文地址:浏览器缓存篇 前言 在前端开发中,缓存有利于加快网页的加载速度,同时缓存能够被反复利用,所以可以减少流量和带宽的开销. 缓存的分类有很多种,CDN缓存.数据库缓存 ...

  8. http-cache浏览器缓存

    摘至知乎 首先得明确 http 缓存的好处 减少了冗余的数据传输,减少网费 减少服务器端的压力 Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间 加快客户端加载网页的速度 常见 ht ...

  9. 学习浏览器缓存(http缓存)

    Q: 浏览器缓存是个什么东东,为什么要学习浏览器缓存涅? A: 浏览器缓存其实就是浏览器保存通过HTTP获取的所有资源,是浏览器将网络资源存储在本地的一种行为.浏览器缓存可以减少冗余数据的传输,减小服 ...

随机推荐

  1. 数据库高级数据库学习--上机练习7(Transact-SQL 函数定义和调用)

    上机练习7 在Transact SQL中,有一类特殊的自定义函数,其返回值为一张表,该类自定义函数被称作内嵌(联)表值函数,其基本语句格式如下: CREATE FUNCTION函数名称[( {@参数名 ...

  2. SQL SERVER 数据库安装完毕之后如何修改数据库实例排序规则

    背景 最近我们在azure portal 上开了几台英文版的数据库服务器,因默认是开启就安装好对应的数据库,所以存在一个实例排序规则的问题,需把整个实例都调整成Chinese_PRC_CI_AS,避免 ...

  3. CentOS6.5升级手动安装GCC4.8.2 转载

    一.简易安装 操作环境 CentOS6.5 64bit,原版本4.4.7,不能支持C++11的特性~,希望升级到4.8.2 不能通过yum的方法升级,需要自己手动下载安装包并编译 1.1 获取安装包并 ...

  4. python基础知识(列表详解)

    列表(list) 列表中可以存入整数.实数.布尔值.字符串.序列.对象 可变序列 列表  []  元素间隔用   ,号分隔 列表的创建和删除 使用赋值运算符直接创建列表 listname = [元素1 ...

  5. PHPBase64格式编码图片

    base64_encode编码图片 /** * 获取图片的Base64编码(不支持url) * @date 2017-02-20 19:41:22 * * @param $img_file 传入本地图 ...

  6. 电脑的sid

    SID的查询方法:1.Win键+R键,打开运行,输入CMD2.输入:whoami /user3.就可以看到本机的SID了 SID的修改方法1.下载NewSID软件,并打开 2.可以指定一个SID,也可 ...

  7. 【神经网络与深度学习】GLOG介绍

    一.安装配置 1.简介 google 出的一个C++轻量级日志库,支持以下功能: ◆ 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为: ◆ 严重性分级,根据日志严重性分级记录日志: ◆ 可 ...

  8. logstash 处理信息规律研究

    1.input file path => "/opt/50910627.log" path => "/path/to/%{+yyyy/MM/dd/hh}.lo ...

  9. gulp时发生错误---------const { Math, Object } = primordials;

    [问题描述] 执行完npm install后,对前台页面进行gulp操作时,报如下错误: const { Math, Object } = primordials; [错误日志] ***@**** M ...

  10. (5.7)mysql高可用系列——MySQL中的GTID复制(理论篇)【转】

    转自:https://blog.csdn.net/wmq880204/article/details/53160078 一.GTID的概述: 1.全局事物标识:global transaction i ...