好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

当我谈缓存的时候,我谈些什么_html/css_WEB-ITnose

TL;DR

前面大段的内容都是基本概念的介绍,建议没时间的同学直接拖到最下面看。

Web 缓存是可以自动保存常见文档副本的 HTTP 设备 。对,当谈到缓存的时候,就是指那些设备,如浏览器,代理缓存服务器等。

通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本。因此,缓存和重用以前获取的资源的能力成为优化性能很关键的一个方面。

使用缓存有下列的优点:

缓存 减少了冗余的数据传输 ,节省了你的网络费用。

缓存 缓解了网络瓶颈的问题 ,不需要更多的带宽就能够更快的加载页面。

缓存 降低了对原始服务器的要求 ,服务器可以更快的响应,避免过载的出现。

缓存 降低了距离时延 ,因为从较远的地方加载页面会更慢一些。

冗余的数据传输

有很多小网站没有对文档做缓存处理,这样客户端每次访问相同的文档(例如 jQuery.js)的时候,都要从服务器下载相同的文档到本地客户端,造成大量的冗余数据传输。

带宽瓶颈

缓存会缓解有限广域网络带宽的瓶颈问题。很多网络会为本地客户端提供的带宽比为远程服务器提供的带宽更宽。如果客户端可以从一个快速局域网的缓存中获得一份副本,自然可以提高性能。

瞬间拥塞

12306 的春运,微博的春晚红包等都会遇到这种情况。12306 放票的时间段,会有大量的用户去抢票,出现瞬间拥塞。瞬间拥塞可能会使网络和 web 服务器发生崩溃。 DDOS 也是相同情况。

距离时延

假设淘宝的主服务器都放在杭州的一台服务器上。而在美国的客户端打开了淘宝,需要下载淘宝的首页;再假设数据的传输都是以光速的速度传输。杭州到华盛顿的距离大概有14,000公里,这样光速自身传输就需要大概90ms的时间(算上请求和返回的时间),如果淘宝页面上只有20个图片,这样单连接的情况下,就大概需要(打开连接请求 90ms + GET web 页面的90ms + GET 所有图片的 90 * 20 = 1800 ms)1980ms 的时延。注意,这个只是时延。也就是说这个距离下 20 张图片就会比客户端在本地的请求延迟大概 2s 的时间。

命中和未命中的

缓存命中(cache hit) 缓存的设备(可以是代理缓存服务器,也可以是本机)中有可以使用的副本。

缓存未命中(cache miss)缓存的设备中没有可以使用的副本,这个请求就会被转发给原始服务器。

保持副本的新鲜

服务器上的文本内容随时可能发生变化,如:淘宝首页的一个文件中需要增加记录用户点击日志的功能,所以需要修改某个js文件,以增加对应的功能。对于这种情况,缓存就要不时的对其进行检测,看看它们保存的副本是否仍是服务器上最新的副本。对于这种检测,就被称为 新鲜度检测 ,这些新鲜度检测就被称为 HTTP 再验证 。

再验证

为了有效的进行再验证,HTTP 定义了一些特殊的请求,不用从服务器上获取整个对象,就可以快速检测出内容是否是最新的。最常用的是 If-Modified-Since 首部(后面的内容会提一下 ETag 和 If-None-Match)。当这个首部被加入到 GET 请求中去,就可以告诉服务器:只有缓存了对象的副本之后,又对其进行了修改的情况下,才发送此对象。

对于服务器接收到 GET If-Modified-Since 请求时大概会发生以下三种情况:

再验证命中

如果服务器对象未被修改,服务器回想客户端发送一个小的 HTTP 304 Not Modified 响应。

再验证未命中

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

对象被删除

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

If-Modified-Since 是 HTTP 请求首部,可以与 Last-Modified 服务器响应首部配合工作。原始服务器会将最后的修改日期附加到所提供的文档上去。当缓存要对已缓存文档进行再验证时,就会包含一个 If-Modified-Since 首部,其中携带有最后修改已缓存副本的日期。

       hello     

no cache

查看更多关于当我谈缓存的时候,我谈些什么_html/css_WEB-ITnose的详细内容...

  阅读:32次