
文章插图
Last-Modified/If-Modified-Since 规则第一次请求服务器
当客户端再次请求服务器时,会把 Last-Modified 连同请求的资源一起发给服务器,这时 Last-Modified 会被命名为 If-Modified-Since,存放的内容都是一样的 。
服务器收到请求,会把 If-Modified-Since 字段与服务器上保存的 Last-Modified 字段作比较:
- 若服务器上的 Last-Modified 最后修改时间大于请求的 If-Modified-Since,说明资源被改动过,就会把资源(包括 Header+Body)重新返回给浏览器,同时返回状态码 200 。
- 若资源的最后修改时间小于或等于 If-Modified-Since,说明资源没有改动过,只会返回 Header,并且返回状态码 304 。浏览器接受到这个消息就可以使用本地缓存库的数据 。

文章插图
Last-Modified/If-Modified-Since 规则第二次请求服务器
注意:Last-Modified 和 If-Modified-Since 指的是同一个值,只是在客户端和服务器端的叫法不同 。
②ETag / If-None-Match 规则
客户端第一次请求的时候,服务器会给每个资源生成一个 ETag 标记 。这个 ETag 是根据每个资源生成的唯一 Hash 串,资源如何发生变化 ETag 随之更改,之后将这个 ETag 返回给客户端,客户端把请求的资源和 ETag 都缓存到本地 。
ETag 被保存以后,在下次请求时会当作 If-Noe-Match 字段被发送出去 。

文章插图
ETag/If-None-Match 第一次请求服务器
在浏览器第二次请求服务器相同资源时,会把资源对应的 ETag 一并发送给服务器 。在请求时 ETag 转化成 If-None-Match,但其内容不变 。
服务器收到请求后,会把 If-None-Match 与服务器上资源的 ETag 进行比较:
- 如果不一致,说明资源被改动过,则返回资源(Header+Body),返回状态码 200 。
- 如果一致,说明资源没有被改过,则返回 Header,返回状态码 304 。浏览器接受到这个消息就可以使用本地缓存库的数据 。

文章插图
ETag/If-None-Match 第二次请求服务器
注意:ETag 和 If-None-Match 指的是同一个值,只是在客户端和服务器端的叫法不同 。
CDN 缓存
HTTP 缓存主要是对静态数据进行缓存,把从服务器拿到的数据缓存到客户端/浏览器 。
如果在客户端和服务器之间再加上一层 CDN,可以让 CDN 为应用服务器提供缓存,如果在 CDN 上缓存,就不用再请求应用服务器了 。并且 HTTP 缓存提到的两种策略同样可以在 CDN 服务器执行 。
CDN 的全称是 Content Delivery Network,即内容分发网络 。

文章插图
CDN 工作简图
让我们来看看它是如何工作的吧:
- 客户端发送 URL 给 DNS 服务器 。
- DNS 通过域名解析,把请求指向 CDN 网络中的 DNS 负载均衡器 。
- DNS 负载均衡器将最近 CDN 节点的 IP 告诉 DNS,DNS 告之客户端最新 CDN 节点的 IP 。
- 客户端请求最近的 CDN 节点 。
- CDN 节点从应用服务器获取资源返回给客户端,同时将静态信息缓存 。注意:客户端下次互动的对象就是 CDN 缓存了,CDN 可以和应用服务器同步缓存信息 。
负载均衡缓存
说完客户端(HTTP)缓存和 CDN 缓存,我们离应用服务越来越近了,在到达应用服务之前,请求还要经过负载均衡器 。
【没看这篇干货,别说你会使用“缓存”】虽说它的主要工作是对应用服务器进行负载均衡,但是它也可以作缓存 。可以把一些修改频率不高的数据缓存在这里,例如:用户信息,配置信息 。通过服务定期刷新这个缓存就行了 。

文章插图
负载均衡缓存工作简图
以 Nginx 为例,我们看看它是如何工作的:
- 用户请求在达到应用服务器之前,会先访问 Nginx 负载均衡器,如果发现有缓存信息,直接返回给用户 。
- 如果没有发现缓存信息,Nginx 回源到应用服务器获取信息 。
- 另外,有一个缓存更新服务,定期把应用服务器中相对稳定的信息更新到 Nginx 本地缓存中 。
推荐阅读
- UI进阶知识-按钮设计,看这篇文章就够了
- 关于消息队列的优缺点,看这篇就行
- 看完这篇你还不知道这些队列,我这些图白作了
- 红薯粉怎么辨别真假?干货店老板:教你5招,看一眼就能区别
- 汽车是真皮座椅,还需要座垫套吗?这篇文章来给你答案
- 茶是极简
- 看了这篇文章 我才知道PS混合模式这么简单
- 这篇文章把 Linux 系统讲的如此详细,看完你一定会有质的飞跃
- 梦见冒烟但没看见火焰浇灭了 梦见冒烟但没看见火焰一直逃避
- PHP的缓冲区你了解过吗
