Mr.J-- HTTP学习笔记(七)-- 缓存

Web 缓存是可以自动保存常见文档副本的 HTTP 设备。使用缓存有下列优点:

• 缓存减少了冗余的数据传输, 节省了你的网络费用。
• 缓存缓解了网络瓶颈的问题。 不需要更多的带宽就能够更快地加载页面。
• 缓存降低了对原始服务器的要求。 服务器可以更快地响应, 避免过载的出现。
• 缓存降低了距离时延, 因为从较远的地方加载页面会更慢一些。

我的专栏:  HTTP学习笔记

相关问题

冗余的数据传输

冗余的数据传输会耗尽昂贵的网络带宽, 降低传输速度, 加重 Web 服务器的负载。 有了缓存, 就可以保留第一条服务器响应的副本, 后继请求就可以由缓存的副本来应对。

网络的瓶颈问题

很多网络为本地网络客户端提供的带宽比为远程服务器提供的带宽要宽。 客户端会以路径上最慢的网速访问服务器。如果客户端从一个快速局域网的缓存中得到了一份副本, 那么缓存就可以提高性能——尤其是要传输比较大的文件时。

带宽造成的传输时延, 理想化情况(以秒为时间单位)

瞬间拥塞

缓存在破坏瞬间拥塞(Flash Crowds) 时显得非常重要。 突发事件(比如爆炸性新闻、 批量 E-mail 公告, 或者某个名人事件) 使很多人几乎同时去访问一个 Web 文档时, 就会出现瞬间拥塞。

距离时延

每台网络路由器都会增加因特网流量的时延。 即使客户端和服务器之间没有太多的路由器, 光速自身也会造成显著的时延。

命中和未命中

缓存命中、 未命中以及再验证

可以用已有的副本为某些到达缓存的请求提供服务。 这被称为缓存命中(cache hit)。

其他一些到达缓存的请求可能会由于没有副本可用, 而被转发给原始服务器。 这被称为缓存未命中(cache miss)。

原始服务器的内容可能会发生变化, 缓存要不时对其进行检测, 看看它们保存的副本是否仍是服务器上最新的副本。 这些“新鲜度检测” 被称为 HTTP 再验证(revalidation)。

成功的再验证比缓存未命中要快, 失败的再验证几乎和未命中的速度一样

只要缓存知道副本仍然有效, 就会再次将副本标识为暂时新鲜的, 并将副本提供给客户端,这被称作再验证命中(revalidate hit) 或缓慢命中(slow hit)

再验证命中:如果服务器对象未被修改, 服务器会向客户端发送一个小的 HTTP 304 Not Modified 响应。

再验证未命中:如果服务器对象与已缓存副本不同, 服务器向客户端发送一条普通的、 带有完整内容的 HTTP 200 OK 响应。

对象被删除:如果服务器对象已经被删除了, 服务器就回送一个 404 Not Found 响应, 缓存也会将其副本删除。

命中率

由缓存提供服务的请求所占的比例被称为缓存命中率(cache hit rate, 或称为缓存命中比例), 有时也被称为文档命中率(document hit rate)
缓存的管理者希望缓存命中率接近 100%。 而实际得到的命中率则与缓存的大小、缓存用户兴趣点的相似性、 缓存数据的变化或个性化频率, 以及如何配置缓存有关。
有些人更愿意使用字节命中率(byte hit rate) 作为度量值,字节命中率表示的是缓存提供的字节在传输的所有字节中所占的比例。 通过这种度量方式, 可以得知节省流量的程度。

缓存的拓扑结构

缓存可以是单个用户专用的, 也可以是数千名用户共享的。 专用缓存被称为私有缓存(private cache)。 私有缓存是个人的缓存, 包含了单个用户最常用的页面。 共享的缓存被称为公有缓存(public cache)。 公有缓存中包含了某个用户团体的常用页面。

私有缓存

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

公有缓存

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

代理缓存的层次结构

在实际中, 实现层次化(hierarchy) 的缓存是很有意义的, 在这种结构中, 在较小缓存中未命中的请求会被导向较大的父缓存(parent cache), 由它来为剩下的那些“提炼过的” 流量提供服务。

注意:

  1. 父缓存可能要更大一些, 以便装载在多用户间流行的文档, 它们还要接收来自很多子缓存的聚合流量,这些子缓存的兴趣点可能很分散,所以还需要更高的性能。
  2. 在实际中, 网络结构会尝试着将其深度限制在连续的两到三个代理以内。 但是, 新一代的高性能代理服务器会使代理链的长度变得不那么重要。

缓存的处理步骤

(1) 接收

缓存从网络中读取抵达的请求报文。高性能的缓存会同时从多条输入连接上读取数据, 在整条报文抵达之前开始对事务进行处理。

(2) 解析

缓存对报文进行解析, 提取出 URL 和各种首部。

(3) 查询

缓存查看是否有本地副本可用, 如果没有, 就获取一份副本(并将其保存在本地)。

(4) 新鲜度检测

缓存查看已缓存副本是否足够新鲜, 如果不是, 就询问服务器是否有任何更新。

(5) 创建响应

缓存会用新的首部和已缓存的主体来构建一条响应报文。

(6) 发送

缓存通过网络将响应发回给客户端。

(7) 日志

缓存可选地创建一个日志文件条目来描述这个事务。

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

缓存 GET 请求的流程图

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章