Published on

缓存那些事

Authors
  • avatar
    Name
    noodles
    每个人的花期不同,不必在乎别人比你提前拥有

简介

如何利用缓存在计算机系统或者网络服务中都是提升系统体验的的一个很重要的思考方向.相对于网络(磁盘)的I/O,直接将需要的数据存储到一个相对较快的获取位置,这样就能尽快的获取到需要的资源.这里主要总结下在前端开发中一些缓存方面的知识.

请求资源

下面这个图总结了网络请求中缓存涉及的几个方面,下面将具体的从每个方面进行展开.
缓存

本地-强缓存

强缓存是浏览器在请求具体的资源的时候,直接使用本地缓存的资源的副本而不通过服务器去验证资源的相关信息的一种方式.通常有通过expires和Cache-Control中的max-age来控制.

字段意义优先级
expires指定缓存的过期时间(与客户端的时间设置相关)HTTP 1.0 max-age优先expires
max-age指定请求资源过后多少秒后资源过期HTTP 1.1 max-age有优先expires

当请求的资源存在本地缓存副本并且处于新鲜期的时候,直接返回本地资源.
当请求的资源没有本地缓存的时候,向服务器拉取对应的资源.
当资源存在缓存但是已经过期的时候,通过缓存协商去服务器获取资源.

请求-缓存协商

缓存协商是指通过与服务端交互缓存资源的信息来判断当前缓存是否可用的一种机制.
当通过缓存协商服务端认为当前的资源是可用的,返回304(响应体是空).客户端可以使用当前缓存资源并且更新缓存相关信息.
当服务端认为资源不可用的时候,返回200(响应体中包含请求的资源).

Cache-Control

Cache-Control 被用于在http请求和响应中通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求设置的指令,在响应中不一定包含相同的指令.

字段意义
no-cache下次请求是强制验证资源有效性,每次对资源的使用都需要验证
no-store不进行缓存
max-age相对于请求时间设置的最大过期时间
public可以被客户端和代理缓存
private只能客户端缓存,不能被代理缓存
must-revalidate缓存必须在使用之前验证旧资源的状态,并且不可使用过期资源,只有在缓存过期的时候才要求验证

last-modified和Etag

last-modified和Etag(Etag还可以结合If-Match来判断当前提交的内容跟服务端存储的内容是否一致)都是在响应头中返回的对资源的一些设置信息,可以通过这两个值来缓存协商当前缓存资源时候可用.

字段意义作用方式优先级
last-modified资源在服务端的上次修改时间通过在请求头中设置If-Modified-Since的值为缓存资源的last-modified值来与服务端询问缓存的新鲜度服务端优先验证Etag
Etag代表资源的实体标识,当资源的内容在服务端修改的时候,需要重新生成Etag通过在请求头中设置If-None-Match的值为缓存资源的Etag值来与服务端询问缓存的新鲜度服务端优先验证Etag
last-modified和Etag的区分

Etag的出现更像是为了弥补last-modified的不足.例如:

  1. last-modified的时间只能精确到秒
  2. 一个资源的频繁修改但是内容并没有修改

存储-协商存储

协商存储就是根据上面学习的相关字段来决定获取到的资源是否可以被存储被下次请求使用的策略.上文已经对相应的字段进行了说明.

CDN

CDN简介

CDN(内容分发网络)指的是一组分布在各个地区的服务器.这些服务器存储着数据的副本,当用户访问资源的时候,CDN服务器可以根据用户的IP,服务集群的负载状态等信息尽快的返回给用户所需要的资源.

CDN优点

CDN主要的功能是托管静态资源,项目中对静态资源进行CDN的配置已经是标配,使用CDN主要有以下优点:

  1. 将静态资源托管给CDN起到给源站分流的作用,降低服务端负载,解决网络网络带宽问题和不同服务商网络速度不同的问题.
  2. 对资源的请求大部分都在CDN的边缘节点完成,访问延迟降低,用户能尽快的看到内容.
  3. CDN域名与源站域名不同,源站的cookie不会随着静态资源的请求发送,能一定程度上减少网络数据的发送.

CDN请求资源流程

  1. 当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器.
  2. CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户.
  3. 用户向CDN的全局负载均衡设备发起内容URL访问请求.
  4. CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求.
  5. 区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力.基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址.
  6. 全局负载均衡设备把服务器的IP地址返回给用户.
  7. 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地.

CDN优化

  1. 合理设置CDN节点的缓存时间,保证用户能及时同步到最新的内容
  2. 根据不同的路径 配置不同的缓存规则,实现缓存的最大化
  3. CDN缓存节点预热

缓存的意义

  1. 资源或者服务的尽快到达和可用

  2. 解决网络带宽问题和服务负载

  3. 减少网络流量,让流量做更加有意义的事

思考

缓存能给应用带来一定的好处,同时也给服务增加了一些负载(保证资源的更新,增加缓存的成本等等).在对系统的一些基础服务做修改的时候,先要把这些有可能出现问题的点考虑清楚或者为什么这么做想好,在去做事.