Web 缓存

Web 缓存是可以自动保存常见文档副本的 HTTP 设备。当 Web 请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档。使用缓存有下列有点:

  • 缓存减少了冗余的数据数据传输。
  • 缓存缓解了网络瓶颈的问题。很多网络为本地网络客户端提供的带宽比为远程服务器提供的带宽要宽。
  • 缓存降低了对原始服务器的要求。缓存在破坏瞬间拥塞时显得非常重要。
  • 缓存降低了距离时延。

缓存的拓扑结构

  • 专用缓存被称为私有缓存。私有缓存是个人的缓存,包含了单个用户最常用的页面。
  • 共享的缓存被称为公有缓存。公有缓存中包含了某个用户团体的常用页面。

私有缓存

私有缓存不需要很大的动力或存储空间,这样就可以将其做的很小,很便宜。Web 浏览器中有内建的私有缓存 - 大多数浏览器都会将常用文档缓存在你个人电脑的 磁盘 和 内存 中,并且允许用户去配置缓存的大小和各种设置。

公有代理缓存

公有缓存是特殊的共享代理服务器,被称为缓存代理服务器,或者更常见地被称为代理缓存。代理缓存会从本地缓存中提供文档,或者代表用户与服务器进行联系。共有缓存会接受来自多个用户的访问,所以通过它可以更好地减少冗余流量。

缓存的处理步骤

Web 缓存的基本工作原理大多很简单。对一条 HTTP GET 报文的基本缓存处理过程包括 7 个步骤。

  • 接受 - 缓存从网络中读取抵达的请求报文。
  • 解析 - 缓存对报文进行解析,提取出 URL 和各种首部。
  • 查询 - 缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存在本地)。
  • 新鲜度检测 - 缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。
  • 创建响应 - 缓存会用新的首部和已缓存的主体来构建一条响应报文。
  • 发送 - 缓存通过网络将响应发回给客户端。
  • 日志 - 缓存可选地创建一个日志文件条目来描述这个事物。

新鲜度检测

HTTP 有一些简单的机制可以在不要求服务器记住有哪些缓存拥有其文档副本的情况下,保持已缓存数据与服务器数据之间充分一致。HTTP 将这些简单的机制称为:

  • 文档过期
  • 服务器再验证

文档过期 响应首部

首部描述
cache-control: max-agemax-age 值定义了文档的最大 使用期 - 从第一次生成文档到文档不再新鲜、无法使用为止,最大的合法生存时间(以秒为单位)
Expires指定一个绝对的过期日期。如果过期日期过了,就说明文档不再新鲜了。

服务器再验证 请求首部

首部描述
If - Modified - Since: <date>如果从指定日期之后文档被修改过,就执行请求的方法。
If - None - Match: <tags>服务器可以为文档提供特殊的标签(Etag),而不是将其与最近修改日期相匹配,这些标签就像序列号一样。如果已缓存标签与服务器文档中的标签有所不同,If - None - Match 首部就会执行所请求的方法

什么时候应该使用实体标签和最近修改日期

  • 如果服务器只回送了一个 Last-Modified 值,客户端就可以使用 If-Modified-Since 验证。
  • 如果服务器回送了一个实体标签,HTTP/1.1 客户端就必须使用实体标签验证器。
  • 如果实体标签和最后修改日期都提供了,客户端就应该使用这两种再验证方案,这样 HTTP/1.0 和 HTTP/1.1 缓存就都可以正确响应了。

控制缓存的能力

服务器可以通过 HTTP 定义的几种方式来指定在文档过期之前可以将其缓存多长时间。按照优先级递减的顺序,服务器可以:

  • 附加一个 Cache-Control: no-store 首部到响应中去;
  • 附加一个 Cache-Control: no-cache 首部到响应中去;
  • 附加一个 Cache-Control: must-revalidate 首部到响应中去;
  • 附加一个 Cache-Control: max-age 首部到响应中去;
  • 附加一个 Expires 日期首部到响应中去;
  • 不附加过期日期,让缓存确定自己的过期日期。

no-store

标识为 no-store 的响应会禁止缓存对响应进行复制。缓存通常会像非缓存代理服务器一样,向客户端转发一条 no-store 响应,然后删除对象。

no-cache

标识为 no-cache 的响应实际上是可以存储在本地缓存区中的。只是在与原始服务器进行新鲜度再验证之前,缓存不能将其提供给客户端使用。

max-age

表示的是从服务器将文档传来之时起,可以认为此文档处于新鲜状态的秒数。

must-revalidate

可以配置缓存,使其提供一些陈旧(过期)的对象,以提高性能。如果原始服务器希望缓存严格遵守过期信息,可以在原始响应中附加一个 Cache-Control: must-revalidate 首部。Cache-Control: must-revalidate 响应首部告诉缓存,在事先没有跟原始服务器进行再验证的情况下,不能提供这个对象的陈旧副本。

Expires

不推荐使用 Expires 首部,它指定的是实际的过期日期而不是秒数。由于很多服务器的始终不同步,或者不正确,所以最好还是用剩余秒数,而不是绝对时间来表示过期日期。

强弱验证器

实体标签和最近修改日期都是缓存验证器。有时,服务器希望在对文档进行一些非实质性或不重要的修改时,不要使所有的已缓存副本都失效。HTTP/1.1 支持 “弱验证器” ,如果只对内容进行了少量修改,就允许服务器声明那是 “足够好” 的等价体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值