Web缓存作为在商店购买牛奶的示例


如果您在商店购买牛奶,则可以了解缓存在服务器端和浏览器端的工作方式。

如果您是活跃的Internet用户(很可能是这种情况),那么您将不断使用缓存,但是您可能不知道“幕后”:何时以及如何工作。

从开发人员的角度来看,缓存使创建高性能的Web应用程序和Web服务器变得容易:您不需要不断优化负载有成千上万个请求的服务器-您只需实施缓存协议,生活就会变得更加轻松。

缓存时,页面加载时间从2秒减少到1秒...这不是很令人印象深刻,对吧? 但是当您必须处理大量用户的请求时,就不能没有它。

通过在我的一个Web应用程序中使用缓存,我意识到仅了解术语并不是解释这种方法的最佳方法。 在我看来,一个很好的比喻是牛奶从农场到冰箱的路径。

要理解我的解释,您需要了解一些有关Web服务器工作原理基本知识 。 让我们开始吧!

翻译成Alconost

如果不进行缓存,互联网将是什么样?


在继续进行缓存之前,让我们考虑一下如果没有它,互联网将会如何。 想象一下,您生活在18至19世纪。 在乡下。 您有一个农场,但没有冰箱。 您养了几头母牛,但它们的牛奶很快变质,因此很难从中受益。

顺便说一句,在某些地方,人们仍然没有冰箱:他们要么立即喝新鲜的牛奶,要么将其与谷物混合并发酵 -一种有趣的方法,对吗?

通常,您想将牛奶卖给其他村民。 但是他们将不得不很快喝掉它。 假设一头母牛每天可以生产十升牛奶。 这意味着,如果太多的人突然来农场喝牛奶,您将不得不要求他们第二天返回。



当您只能多买几头奶牛并进行扩张时,情况就不是这样了,因为您的客户群有限:只有一个村庄的居民才能购买牛奶。 因此,有一定的限制。



没有缓存,服务器的处理能力会限制您。 缓存用于加载静态资源,例如:

  • 图片
  • 的CSS
  • 静态html文件
  • JavaScript文件。

默认情况下,对于每个传入请求,服务器应发送一个新响应。 但是页面加载请求实际上可能意味着四个单独的请求-上面每个类别一个。 考虑到图像文件通常非常庞大,因此来自世界各地的大量用户将很容易使服务器过载,并且页面加载时间将更长。



理想情况下,我想减少服务器的负载,以某种方式保留常见请求的答案。 服务器不必处理每个新的单独请求-将从缓存中接收响应。 当然,您总是可以派出钱并添加更多服务器,但这会导致成本不受控制地增加。

服务器端缓存


回到我们的牛。 您知道什么会促进我们奶牛场的工作吗?

用冰箱购物!

居民不再需要去农场立即喝牛奶,因为牛奶可以安全地保存数周。

商店减轻了农场的负担:现在不必为每个购买者而烦扰母牛了。 商店可以满足需求,您每天只需要挤奶即可。 还有一个好处:现在,邻近村庄的居民将能够购买冰箱中存储的牛奶。





服务器端缓存将像商店一样处理流行的请求并更快,更可靠地交付内容。

上图显示了缓存代理服务器 :它存储用于响应常见请求的静态文件。 该服务器拦截此类请求并迅速给出答案,使您可以从主Web服务器上删除相应的负载。

此时,您可能已经有疑问:

  1. 如何定义一个“流行”查询?
  2. 响应在代理缓存中存储多长时间?

为了说明这一点,您将需要更详细的指南来设置缓存,但是对于我们而言,重要的是要了解一个重要的概念- 新鲜感 。 缓存代理上将有不同的文件,它们在不同的时间进行缓存,因此需要确定是否仍然发出这些文件。 这将取决于缓存策略

这也类似于将牛奶存储在商店中。 店长需要决定将牛奶丢弃多长时间。 高速缓存代理通过高速缓存命中的百分比(可以通过高速缓存服务器传递的内容的百分比)来衡量其性能。

内容传递网络


因此,我们有一间杂货店出售您的牛奶。 已经不错,但是居民只能在一家本地商店购买牛奶,而且不太可能有人从远方来。 为了扩大产量,您需要在更多商店出售牛奶。

因此,您开始将牛奶运送到其他商店,从而满足更广泛的地理区域的需求。 这类似于内容分发网络(CDN)-位于世界各地的代理(例如上面讨论的代理)。

作为最终用户,您可能会认为高速Internet允许您非常快速地加载大多数站点。 但是,这主要归功于CDN的使用,可快速交付静态文件。

如果您在英格兰,并且正在尝试下载在哈巴罗夫斯克服务器上缓存的文件,则答案将有一定的延迟:信号将花费时间来传输数千公里的电缆。 因此,英国的本地缓存代理服务器将使您更快地加载站点。





因此,您的服务器可以将静态资源的副本发送到CDN上的每个代理服务器,以便它们处理本地请求,直到资源不再“新鲜”为止。 流行的CDN服务提供商是Rackspace,Akamai和Amazon Web Services。

浏览器端缓存


因此,现在来自全国(甚至全世界)的人们都可以将您农场生产的冷牛奶带回家。 有一个问题:他们不能在家中存放牛奶,所以在购买后必须迅速喝牛奶,然后再去商店购买新的牛奶。 事实证明,这样的系统对于购买者仍然不是很方便。

冰箱可以救我们!

有了冰箱,您可以在家中存放牛奶,而不必每次都去商店。 在缓存方面,这是存储静态资源的完全不同的地方,因为它位于客户端(即运行浏览器的计算机上),而我们的代理服务器位于远程位置。

这种方法不仅在用户经常访问的网站(如Facebook或Amazon)上为用户带来方便,而且由于处理的请求减少,这些网站可以节省服务器成本。





在此需要注意的是,冰箱中的牛奶不会出现! 无论如何,您都需要发出初始请求,该请求将到达服务器或代理服务器,只有在此之后,您才能在本地缓存一些文件。

浏览器如何知道何时从服务器请求新文件? 毕竟,您需要以某种方式更新本地文件。

就像牛奶生产商将有效期放在包装上一样,服务器也会在HTTP响应标头中添加特定的标识符。 HTTP缓存实际上有四种不同的系统 。 上述方案与到期方法非常相似。 但是,在某些其他方法的情况下,需要在发布缓存文件之前向服务器发送请求。



何时开始使用缓存


假设您正在创建第一个Web应用程序。 只要您没有成千上万的用户,您就不必担心缓存协议:没有服务器,运行服务器的成本将足够低。 但是,随着用户群的增长,还需要实施缓存-如果您希望应用程序快速加载。

以Heroku为例,它是部署第一个Web应用程序的出色工具。 但是, 要实现缓存,您将必须使用单独的服务 ,例如Amazon的CloudFront或CloudFlare,这将花费更多的时间来学习。

当您尝试重新加载页面并获取新的静态资源时,您可能会在浏览器端注意到缓存,但是无论刷新多少次,页面都不会改变。

通常,其原因是浏览器端缓存协议。 要绕过浏览器缓存并从服务器请求新资源,可以按Cmd + Shift + R (如果使用Mac)或按Ctrl + Shift + R (在PC上)。

关于翻译

这篇文章由Alconost翻译。

Alconost以68种语言本地化游戏应用程序和网站 。 母语翻译,语言测试,带有API的云平台,持续本地化,24/7项目经理,任何格式的字符串资源。

我们还制作广告和培训视频 -适用于销售,图像,广告,培训,预告片,专家,Google Play和App Store的预告片的网站。

更多细节

Source: https://habr.com/ru/post/zh-CN416255/


All Articles