关于缓存那些事

1、什么是缓存

答:简单的说,缓存就是数据交换的缓冲区。当浏览器请求数据的时候,如果服务器或者浏览器没有缓存的话,就会直接在源站上请求,这样就会消耗内存,影响网站性能。所以对于一些固定的库,我们需要做缓存。这样就会提高网站性能。现在网站用的缓存一般是CDN,所以下面就重点说一下CDN缓存。

2、什么是CDN

答:全称Content Delivery Network:即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。举个简单的例子:

10年前买火车票:10年前还没有火车代售点一说,12306.cn更是没有。那个时候买火车票只能去火车站售票大厅进行购买,而如果是在小县城没有火车,买车票就要去市里火车站,而从县城到市里来回就要4个小时,再加上排队买票,简直就是在浪费生命。后来县城有了火车票代售点,可以直接在代售点购买火车票,方便很多,不用去同一个车站排队购买了。

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

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

以下是CDN工作拓扑图


3、客户端(浏览器)缓存

  • 客户端缓存的缺点

   客户端缓存则会减少对服务器的请求,从而避免了对某些文件的重复请求,大大的提高了网站的性能,但是客户端缓存有个明显的缺点,就是当重新发布项目时,由于客户端存在缓存,所以就不能及时的更新最新的文件(例如,js、css以及图片),这样就会造成网站样式以及脚本文件的丢失,如果单纯的按F5刷新根本不起作用,以下介绍几种方法解决这个问题

  • 浏览器的缓存策略

   过期头(Expires)

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

   缓存控制头(Cache-Control)

Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令 通常覆盖默认缓存算法。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。

cache-control 定义是:Cache-Control = “Cache-Control” “:” cache-directive


Max-age 使用秒来计量,如:

Cache-Control:max-age=645672 指定页面645672秒(7.47天)后过期。

控制文件是否有修改过(Last-Modified E-Tag)

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

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

服务器返回ETag标签:
ETag:"39001d-1762a-50bf790757e00"

  • 如何设置响应头

   在HTTP消息头中,按其出现的上下文环境,分为通用头、请求头、响应头等。目前阿里云提供9个HTTP响应头参数可供您自行定义取值,参数解释如下:


  • 操作步骤
  1. 登录CDN控制台,进入域名管理页面,选择需要设置的域名,单击管理。
  2. 缓存配置 > HTTP头,您可以单击修改或删除对HTTP的参数进行相应操作。您也可以单击添加,选择参数,并输入取值,然后单击确认,添加自定义HTTP头参数。

4、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节点上的数据缓存过期,保证客户端在访问时,拉取到最新的数据。

5、CDN有时候会出现某个地区网络延迟,这样就会导致网站样式或脚本文件丢失,该怎么办?

答:可以使用jsdelivr,jsdelivr是一个静态文件的CDN,要比CDN稳定一些。www.jsdelivr.com/

6、对于HTML、图片更新之后在服务器上存在缓存,不能及时更新,该如何处理?

答:方法一:

<meta http-equiv="Expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache" content="no-cache">
复制代码

方法二:

1、首先需要设置IIS允许运行时编辑Metabase.xml文件(如果找不到,就先停止IIS,就可以进行更改该文件)

2、运行中输入   notepad c:\WINDOWS\system32\inetsrv\MetaBase.xml 打开IIS配置文件

3、在文件中搜索要配置禁止缓存的虚拟目录名字,找到类似如下配置节,如果找不到,直接添加

"/LM/W3SVC/1832041641/root/inc"
        AccessFlags="AccessRead | AccessScript"
        AppFriendlyName="inc"
        AppIsolated="2"
        AppRoot="/LM/W3SVC/1832041641/Root/inc"
        DirBrowseFlags="DirBrowseShowDate | DirBrowseShowTime | DirBrowseShowSize | DirBrowseShowExtension | DirBrowseShowLongDate | EnableDefaultDoc"
        Path="D:\publish\inc"
        MD_VR_NO_CACHE="1"
    >
IIsWebVirtualDir>
复制代码

4、保存并重启IIS即可。

总结:该方法亲测有效,不足之处,望多指教。谢谢!



你可能感兴趣的:(关于缓存那些事)