在我上个月的文章《3 Backend Fixes to Increase Page Speed》中,我解释了缓存可以应用于电子商务网站的许多领域,而在本文中,我将逐一讨论每个主要层级。
要理解缓存的层级,可以把它想象成洋葱。最外层是你一眼就能看到的;剥开它,你会发现另一层,接着又是另一层。
网站的工作原理与此类似。对内部层级的速度优化通常能提升网站在任何外部层级上的性能。让我们从最熟悉的层级——浏览器——开始。
浏览器缓存
顾客的网页浏览器可以作为您商店的缓存。浏览器会保存并缓存它请求的文件,这样以后就不必再回到您的服务器(一种检索文件并为其他用途“提供”服务的软件)去获取它们了。
If a browser requests a file — say an image named “ipad-white.jpg” — your server will send that file to the browser. The next time you ask for that image, the browser detects that the file was already downloaded, so it will not ask your server for a new copy. Instead it will reuse the existing one, saving time and bandwidth.
如果您曾经访问过一个本应更新却没有更新的网站,并被提示强制刷新,那么问题就出在浏览器缓存上。浏览器没有获取新文件,而是使用了旧的缓存文件。强制刷新会让浏览器清除其缓存并重新下载所有内容。
浏览器缓存很容易实现。大多数浏览器开箱即用即可进行缓存设置。然而,有时需要对 Web 服务器进行调整以适应浏览器缓存。
Web 服务器
更深一层是 Web 服务器。当浏览器需要某个文件时,就会访问这个服务器。
Web 服务器通过以下三种方式之一向浏览器发送文件:
- 对于已存在的文件,服务器会在硬盘中找到它们并将其发送给浏览器。
- 对于必须生成的文件,Web 服务器会与应用程序服务器通信,这是一个额外的层级。
- 如果在硬盘或应用程序服务器上找不到该文件,Web 服务器将返回 404 错误——文件未找到。
最快的选项是文件已经存在于 Web 服务器的硬盘上。服务器可以立即将文件发送回去。唯一的真正速度变量是浏览器与 Web 服务器之间的网络传输限制。
有时,所请求的文件是由应用程序服务器创建用作缓存的。Web 服务器不必为每个页面都与应用程序服务器通信,而是由应用程序服务器创建一个文件的缓存版本,这样下次 Web 服务器就不必再访问应用程序服务器了。
许多网站使用内容分发网络(CDN),这是一种通俗的说法,意指全球各地都有第三方 Web 服务器拥有您文件的副本。浏览器可以同时请求多个文件。因此,如果浏览器从您的主 Web 服务器和多个 CDN 服务器请求文件,它们接收文件的速度会比单独从一个服务器请求一个文件更快。
应用程序服务器
应用服务器是构建动态页面的层级。有时,应用服务器是 Web 服务器的一部分,例如“mod_php”。在其他情况下,应用服务器是独立的软件组件,可能位于同一台计算机上,也可能不位于同一台计算机上。
当Web服务器无法为浏览器找到文件时,它会向应用服务器请求该文件,这会导致您的电子商务商店的后端代码运行并生成文件,然后文件被发送回Web服务器,再发送回浏览器,最终展示给您的购物者。
在应用服务器层面,有多种缓存选项:
- 整个页面可以被缓存,并在请求时重新发送给 Web 服务器。
- 页面的部分组件可以被缓存,以便在需要这些部分时能够更快地组装它们。想象一下,你的顶部导航栏就是一个可以被缓存并在组装任何其他页面时复用的部分。
- 开发对象和计算结果可以被缓存,以便当页面再次需要它们时,可以直接从“货架”上取用。例如,购物者的购物车内容及其购物车总额可以被缓存。
为此层级创建了许多缓存工具和技术。
数据库服务器
比应用服务器更深一层的是数据库服务器。由于电子商务应用程序数据密集——包括描述、照片、价格等——大多数页面都需要根据数据查找、更新、排序和计算某些内容。
这意味着你的数据库服务器将会非常繁忙。
在数据库服务器内部,有许多额外的缓存选项和层级。通过微调数据库服务器,你可以利用其内置的缓存功能,并加速上述所有层级(应用服务器、Web 服务器、浏览器)的性能。
开发人员花费大量时间调整应用服务器和数据库服务器之间的通信方式。
在浏览器中生成网页的过程可能涉及许多后端交互以及不同层级的服务器。每个服务器——在本例中为 Web 服务器、应用服务器、数据库服务器——都可以通过缓存来优化其性能,从而提高页面加载速度。
硬件
在所有服务器之下,还有另一层:实际的服务器硬件。硬件中内置了多个缓存层级。但除非遇到极端情况,否则尝试优化这些硬件缓存通常不值得。
有两种非缓存的硬件优化措施几乎总是有助于加快商店的运行速度:
- 向上扩展。这意味着获取更大更快的服务器,例如增加内存、升级CPU或添加更快的硬盘驱动器,基本上就是让服务器的硬件变得更大更快。
- 向外扩展。这意味着获取更多相同的服务器并将它们连接起来以分担负载,而不是由一台服务器承担100%的流量,而是使用两台各承担50%流量的服务器。
从短期和长期来看,直接订购更多、更快的硬件往往比尝试优化其他所有层级的缓存更便宜。当然,硬件的能力存在极限,但更换硬件通常具有较好的性价比,尤其是在开发资源稀缺的情况下。
各层相互补充
所有层——浏览器、服务器和硬件——协同工作。
应用服务器可能会缓存页面组件,从而避免下次调用数据库服务器。
Web 服务器可能会从应用服务器获取整个页面并进行缓存,这样在一段时间内就不会因该请求而打扰应用服务器和数据库服务器。
对较低层的改进通常会提升较高层的性能;因此,较低层的延迟也会影响较高层。
虽然缓存功能非常强大,且实现方式多样,但仍需花时间确定导致任何性能问题的根本原因所在层。例如,如果 Web 服务器响应缓慢,那么对数据库服务器的优化效果将微乎其微。

