阅读 2495

利用超市买牛奶来解释web缓存

翻译自原文地址:web caching

如果你曾经在超市买过牛奶, 那么你就能理解服务器端和浏览器端的缓存。

如果您是一个互联网的忠实用户(您可能是),您就可以从一次又一次的缓存中受益。 但是,你可能不知道它(缓存)是何时或如何在幕后发挥其魔力的。

从开发人员的角度来看, 缓存让构建高性能 web 应用和 web 服务器变得要容易得多。开发人员无需不断优化被数千个请求压得喘不过气来的服务器, 而是可以实现缓存协议, 使工作变得更轻松。

由于缓存可能会在加载页面的1秒和2秒之间产生影响, 因此会让人感觉有些...... 不足。但是, 如果您想要处理大量的用户, 这是很有必要的。

在过去的 web 应用中使用缓存后, 我意识到必须有更好的方法来解释它, 而不仅仅是遍历术语。我注意到它与从农场到冰箱的牛奶路径非常吻合, 所以我想这将是一个更好的解释方式。

为了理解本指南, 您只需了解 web 服务器的基础知识。让我们一起学习它!

如果没有缓存, 互联网会是什么样子?

在进入缓存之前, 让我们想想如果没有缓存, 互联网会是什么样子。试想一下, 你生活在17世纪或19世纪的农村地区。你拥有一个农场, 没有制冷设备。你的农场里有几头奶牛, 但它们的牛奶几乎没有那么值钱, 因为它很快就会变质。

有些群体仍然无法获得制冷设备。他们要么直接喝奶牛乳房中的原奶, 要么将牛奶与谷物混合, 让它发酵。这很有趣有趣。

无论如何, 你想把你的牛奶卖给你村里的其他人。但是, 他们喝牛奶的时间将非常有限。假设你的一只奶牛每天能生产一加仑牛奶。但是, 如果有太多的人出现在你的农场寻找牛奶, 你需要让一些人先回家, 让他们等到第二天。

另外, 你甚至不能考虑增加更多的奶牛和扩大你的操作, 因为你有如此有限的分布。你有一些明确的限制那就是只有你村里的其他成员才能买到你的牛奶。

如果没有缓存, 您将受到服务器计算能力的限制。缓存用于加载静态资产, 例如:

  • Images
  • CSS
  • Static HTML files
  • JavaScript files

默认情况下, 服务器必须为每个传入请求提交新的响应。但是, 加载页面的请求实际上可能意味着4个单独的请求——来自上面的每一个类别。当您考虑到较大的图像文件时, 您的服务器可能会被世界各地的用户压得喘不过气来。然后, 用户在等待页面加载时将遇到缓慢的加载时间。

理想情况下, 您希望通过存储对常见请求的响应来缓解服务器上的需求。您的服务器不需要处理每个新的单个请求, 而是您的缓存可以提供即时响应。您可以随时为更多的服务器付费, 但这可能导致无法控制的费用。

什么是服务器端缓存?

返回到我们的农场方案。知道什么会让一个成功的奶牛场更容易经营吗?

一个带冷藏的超市!

这样, 人们就不需要出现在你的农场, 马上消耗牛奶。你将能够保持它安全地保存几个星期的时间。

超市消除了你农场的很多压力, 因为你的奶牛不会被期望实时生产。超市将处理这个需求。你只需要保持奶牛每天的生产力。更好的是, 周围所有村庄的居民现在都可以从你的农场购买牛奶, 因为牛奶永远可以在冰箱里买到。

就像超市一样, 服务器端缓存将处理热门请求, 并更快、更可靠地交付内容。

在上图中, 我使用了术语缓存代理。缓存代理是存储用于响应公共请求的静态文件的服务器。缓存代理将拦截常见请求并快速传递响应。它可以防止这些请求给您的主 web 服务器带来压力。

你可能有很多问题, 比如,

  • 是什么决定了 "流行" 的请求?
  • 代理将缓存响应多长时间?

这也就像超市里的牛奶一样。超市经理需要决定他们会持有你的牛奶多久, 然后再把它扔掉。缓存代理通过缓存命中率 (可通过缓存服务器提供的内容百分比) 来衡量其成功与否。

什么是内容分发网络?

到目前为止, 有一家杂货店在卖你的牛奶。虽然这是一个很大的进步, 但你仍然没有办法把牛奶送到这家当地商店范围以外的人那里。如果你想扩大你的操作, 你需要添加更多的商店。

所以, 假设你开始向更多的超市分发牛奶。现在, 您可以在更大的地理范围内满足客户。这类似于内容交付网络或 cdn。cdn 是位于世界各地的一系列代理服务器 (如我们上面所述)。

作为最终用户, 您可能会感觉到高速互联网允许大多数网站快速加载。然而, 这只是因为他们使用 cdn 来快速传输静态文件!

如果您位于英国, 并且您正在尝试加载缓存在弗吉尼亚服务器中的文件, 您将遇到一些延迟, 因为原始信号只能沿着数千英里的传输。在英国的本地缓存代理将允许站点加载速度更快。

因此, 您的服务器可以将静态文件的副本发送到 cdn 网络中的每个代理服务器, 并且它们可以处理本地请求, 直到这些资源不再 "全新"。一些常见的 cdn 提供商包括 rackspace、akamai 和 amazon web services。

那么浏览器缓存呢?

现在, 全国各地 (或全世界) 的人们都可以从你的农场带回冷牛奶。只有一个问题--他们没有办法把它存放在自己的家里。你的顾客买牛奶后, 还需要很快喝, 然后再回到杂货店买更多的牛奶。所以, 这个系统仍然不能很好地服务于客户。

解决方法是什么?一台冰箱!

有了冰箱, 你可以把牛奶存放在当地, 避免回超市。在缓存术语中, 我们讨论的是一个完全独立的位置来存储静态资产, 因为它位于客户端, 或位于与浏览器相同的计算机上。我们的代理服务器位于远程位置。

这对于你可能经常访问的脸谱或亚马逊等网站来说是很好的。这对他们的服务器成本也很有好处, 因为他们可以减少需要处理的请求数量。

有一件重要的事情需要注意--我们并不是说牛奶神奇地到达你的冰箱!您仍然需要发出到达服务器或代理服务器的初始请求。之后, 您可以在本地缓存某些文件。

您的浏览器如何知道何时从服务器请求新文件?否则, 您将永远不会遇到这些本地文件的更新版本。

嗯, 就像牛奶生产商在他们的牛奶包装上放一个日期一样, 服务器会在 http 响应标头中添加某种标识符。实际上有4个单独的 http 缓存系统。上面显示的方案与 "到期日期" 方法非常相似。其他一些方法仍然要求您的浏览器在发送缓存的文件之前与服务器进行检查。

何时开始使用缓存

假设您正在构建第一个 web 应用。在您拥有数千个用户之前, 您可能无需担心缓存协议, 因为服务器成本仍然很低。但是, 当你进行扩展时, 如果你希望你的应用快速加载, 则需要实现缓存。

例如, heroku 是部署第一个 web 应用的一个很好的工具。但是, 它要求您使用单独的服务来实现缓存, 如 amazon 的 cloudfront 或 cloudflare。这需要更多的时间来学习。

在浏览器方面, 当您尝试使用新的静态资源重新加载页面时, 您可能经历过缓存, 但页面根本不会更改。无论您刷新页面多少次, 都不会有任何更改。

这通常是因为浏览器端的一些缓存协议。要绕过浏览器的缓存并从服务器请求新资产, 您可以在 mac 上使用 cmd + shift + r, 也可以在 pc 上使用 ctrl + shift + r。

参考web caching

关注下面的标签,发现更多相似文章
评论