保持你的网站以极快的速度运行需要很大的努力。
这就是为什么我们会寻找方法来保持站点和图像的优化的原因。
这也是我们发布大量内容以提高WordPress性能和提升网站速度的原因。
这篇文章解释了如何通过使用Web缓存来提高你的站点性能并获得超快的速度。
当你读完这篇文章的时候,你就会知道:
- 什么是缓存。
- 可用的不同类型的Web缓存。
- Web缓存的缺点。
什么是缓存?
缓存是存储经常访问的数据的临时方式。这是存储可重复使用的响应以加快后续请求的一种方式。
当用户后续请求缓存的内容时,这些请求将从缓存完成,而不是一直返回到内容最初存储的服务器。
简而言之,当有人访问你的站点时,缓存将获取你页面的静态快照,然后存储该快照并将其提供给你的访问者。
这可以让你的信息快速传递,而不是让你的访问者等待发出各种请求,因为这会使一切变慢。
实际上,与原始数据所在的位置相比,缓存为将存储的数据交付给用户提供了一种更容易、更快速的机制。
所以,要把这个放在上下文中……
以下是网页的加载方式:
- 在线用户点击你网站的链接(来自搜索结果、其他网站、社交媒体文章、电子邮件等)。
- 用户的浏览器向你的服务器发送请求(称为HTTP请求)。
- 你的服务器编译并交付在用户浏览器中显示网站所需的所有文件(要编译的每个图像、文件、脚本、样式表等都会增加此请求的时间)。
- 最终通过用户的浏览器为用户提供完整且满载的网站。
现在,让我们将其与为你的网站启用缓存时发生的情况进行比较:
- 在线用户点击你网站的链接(来自搜索结果、其他网站、社交媒体帖子、电子邮件等)。
- 用户的浏览器向你的服务器发送HTTP/HTTPS请求。
- 服务器检测到自上次有人访问你的网站以来,你的内容没有更改。
- 服务器抓取存储在其缓存中的网站的静态副本,并将其快速传送到用户的Web浏览器。
- 服务器对所有后续访问重复上面一步,直到页面上的内容已更改或缓存过期并自动清除。
编译请求页面的每个元素比仅仅提供该页面的存储副本所需的时间更长。因此,缓存可以减少处理时间并更快地交付页面。
为什么要使用缓存?
缓存的主要目的是速度。
缓存可能是唯一直接影响页面速度得分的因素。
缓存=页面加载速度更快=页面速度得分更高。
然而,这是有权衡的。为了节省时间和加快速度,缓存需要存储。
因此,用更少的计算时间更快地传递页面意味着有更多的计算机(即服务器)空间来存储缓存的页面数据。
虽然存储变得越来越便宜,但没有空闲的缓存!
缓存听起来像是一个简单的概念(即存储数据以供后续使用),但实际上它相当复杂,因为缓存的许多方面都依赖于服务器配置、可用内存或企业规模等变量来加快某些响应速度。
例如,大型跨国电信公司可能会使用缓存来降低带宽等基础设施成本,而小型企业网站将使用缓存来提高页面加载速度。
可能使高速缓存复杂化的另一个方面是难以存储相同的结果以供随后在高速缓存中使用。
正如软件工程师谢一辉(音译)在他的博客中所说的那样,“当情况变得不同时,你必须使缓存无效,并重新进行(可能很耗时的)计算。”
考虑到缓存的复杂性,这篇文章将只关注Web缓存中使用的方法。
Web缓存是HTTP协议的核心设计功能。对于Web缓存,规则和策略的使用控制如何使用不同的缓存类型存储对请求的HTTP响应。
这些策略中的缓存控制指令控制谁可以缓存响应、在哪些条件下缓存以及缓存多长时间。
不同的缓存类型以及何时使用缓存
当内容从源站(即你的内容最初所在的位置)传输到你的访问者的Web浏览器时,可以使用不同类型的缓存来改进和加快进程。
有效的缓存给内容提供商和内容消费者都带来了好处。其中一些好处包括:
- 降低网络成本。
- 提高了响应速度。
- 从相同的硬件中获得更高的性能。
- 在网络服务中断期间,终端用户可以使用内容。
以下是一些与Web缓存配合良好的最佳数据类型:
- 可以在整个会话中重用或跨所有用户和请求重用的数据。
- 静态数据(不是经常或快速变化的)。
- 计算或检索成本较高的数据。
你不想缓存的数据类型包括银行帐户详细信息、登录、密码等安全信息。
在讨论使用缓存来提高站点速度的方法之前,让我们先来看一下不同类型的缓存及其独特的特征:
客户端缓存与服务器端缓存
在其最基本的形式下,万维网的工作方式是这样的:你将内容存储在服务器上,并允许用户(即客户端)从他们的Web浏览器访问它。
这意味着缓存可以发生在服务器端(称为“服务器端”缓存),也可以发生在客户端(称为“客户端”缓存)。
客户端缓存
客户端缓存发生在访问者的浏览器上。当有人访问你的站点时,他们的浏览器会创建并存储缓存。
下次他们访问你的站点时,加载速度会更快,因为它会从他们的浏览器缓存中读取信息。
所有现代浏览器都支持客户端缓存。浏览器缓存存储静态内容,如HTML和CSS文件、图像和JavaScript。
客户端缓存是高效的,因为它允许浏览器访问文件,而无需从服务器重新加载这些文件。
虽然这对于小型网站来说可能没什么问题,但是如果你有许多并发用户,你会想要考虑使用服务器端缓存。
服务器端缓存
由于客户端缓存发生在访问者的浏览器上,因此你无法控制它。但是你可以控制服务器上发生的事情。
例如,你可以控制是否在服务器上启用缓存。
假设访问者到达你的站点,并且没有启用缓存。他们的浏览器将向你的服务器发送页面请求。
然后,你的服务器必须处理此请求,编译页面,然后将其发送回浏览器。所有这些过程都很耗时,并且会耗尽服务器资源。
虽然这对于流量较低的小站点来说可能工作得很好,但对于流量较高、必须持续处理请求负载并每秒编译页面负载的较大站点来说,这可能会带来灾难。
这就是服务器端缓存派上用场的地方。
服务器存储每个请求的副本。下次你的服务器必须处理相同的请求时,它会检查缓存,如果有副本存储在那里,它会从缓存中为其提供服务。
如果没有副本,则会将请求发送到服务器,在那里对请求进行处理和编译,并将信息发送回访问者的浏览器,然后将副本存储在缓存中,以供后续请求使用。
这降低了服务器负载,使服务器能够处理比正常情况下更多的流量,更快地将你的内容交付给用户,并减少他们的等待时间。
服务器端缓存是你(或者很可能是你的Web主机)设置的缓存。
你应该选择哪种缓存取决于你的需要。有不同的缓存选项和类型需要考虑。
例如:
- 移动缓存。
- 用户缓存。
- OpCode缓存。
- 微缓存。
- 边缘缓存(例如CDNS)。
- 对象缓存。
让我们简要介绍一下这些不同的缓存类型:
移动缓存
移动缓存的工作原理与常规缓存一样,但它是针对移动应用程序和设备的缓存。
移动应用程序向服务器索要一些东西,并将答案(以及问题连同一些元数据,例如何时提出问题和/或将答案保留多久)记录在供移动用户使用的专用缓存文件中。
下一次移动应用程序想要向服务器提问时,它会检查服务器是否已经知道答案,如果已经知道并且答案仍然足够新鲜,则它会从其缓存中为用户提供答案。
否则,它只会再次请求服务器。如果移动应用程序无法获得答案(例如,没有网络连接),它将从其缓存中向用户提供过时的答案。
用户缓存
用户缓存为每个登录用户创建一组专用的缓存文件。
当你的网站上有特定于用户的内容时,例如,如果你正在提供会员功能或允许不同的用户访问不同的内容或功能,则用户缓存非常有用。
使用用户缓存,你的站点将为每个已登录的用户创建单独的缓存,并为未登录的访问者创建另一组缓存文件,因此他们将无法访问你的特殊内容。
如果你计划使用用户缓存,请注意某些服务(如Cloudflare)可以选择“缓存所有内容”。这可能会导致问题,因为缓存无法区分你的登录用户和注销用户。
OpCode缓存
OpCode缓存是PHP的性能增强扩展。OpCode缓存在每个请求之间缓存编译后的PHP代码。
每次执行PHP脚本时,它都会咨询你的服务器以查看结果是否在缓存中。如果不是,它会将脚本结果存储在缓存中。
它是为下一个请求内容的用户保存的。如果已经缓存,则从缓存加载。
OpCode缓存可以提高大中型站点的性能,应该始终在生产环境中使用。
微缓存
微缓存是整页缓存的另一种呈现方式,但只缓存动态生成的内容的静态副本很短的时间-在1-10秒之间。
应该考虑微缓存的唯一实际设置是针对以快速变化的公共内容(如实时股票价格、突发新闻、体育比分等)为特征的高流量站点。
如果你的站点在很短的时间内没有足够的用户使用相同的请求访问你的服务器,那么微缓存就不值得使用。
边缘缓存
边缘缓存(例如,内容分发网络或CDN)指的是使用缓存服务器来存储更靠近最终用户的内容。
假设你的站点托管在洛杉矶的服务器上。如果南非约翰内斯堡的用户访问你的站点,他们的页面请求必须超过10,000英里(16,000公里)才能到达你的Web服务器,然后返回相同的距离才能将页面传送到他们的浏览器。
这与往返月球不太一样,但距离相当远,可能需要很长时间。
在数据传输指令之后开始数据传输之前的延迟称为“等待时间”。
而大多数缓存存储在同一台服务器上,CDN缓存则将网站的文件缓存到世界各地的分布式数据中心。
当用户下一次从数千英里之外访问你的站点时,允许他们从距离他们较近的CDN服务器访问你站点的文件,从而将延迟降至最低。
对象缓存
对象高速缓存存储数据库查询,以便在需要数据时,无需查询数据库即可从高速缓存中传送数据。
因为服务器不需要生成新的结果,所以当在你的WordPress站点上启用它时,它可以缩短PHP执行时间,减少数据库的负载,并更快地将内容交付给你的访问者。
因为WordPress CMS严重依赖于它的数据库,所以保持WordPress数据库的优化和尽可能高效地运行是非常重要的。
在你的站点上启用对象缓存后,通过减轻数据库负载并更快地提供查询,对象缓存有助于防止服务器不堪重负。
WordPress缓存
WP_Object_Cache
自2005年引入2.0版本以来,WordPress就利用了内置的对象缓存(称为WP_Object_Cache)。
WordPress对象缓存自动将数据库中的数据存储在PHP内存中,以防止重复查询使数据库过载。
然而,此功能的不足之处在于,WP对象缓存仅存储单个加载的数据库中的数据。
每次请求结束时,对象都会被丢弃,下次用户请求页面时必须从头开始重新构建对象。
虽然这很有用,因为它可以确保WordPress数据库在单个页面加载期间不会被多次查询,但如果对象缓存可以用于在多个页面加载过程中持久地缓存类似的查询请求,那么它会更高效、更强大。
这就是持久对象缓存解决方案可以提供帮助的地方。
持久对象缓存
持久化对象缓存允许对象缓存在请求之间持久化,从而帮助加快数据库查询的交付速度,并减轻服务器的工作负荷。
流行的持久对象缓存工具包括memcached、redis和Varish。
memcached和Redis不是“缓存”,它们是缓存服务器–或使用数据库存储缓存项目的缓存引擎。
本质上,它们是像MySQL一样的数据库服务器,旨在持久地存储数据并更快地提供内容,因为数据存储在RAM中。
用户每次发出请求时,请求都会查询缓存。如果数据库中有匹配项,缓存将提供内容。
Memcached
正如他们的网站上所说的那样:
memcached是内存中的键值存储,用于存储来自数据库调用、API调用或页面呈现结果的小块任意数据(字符串、对象)。
memcached于2003年首次开发,是一个免费的、开源的分布式内存对象缓存系统,旨在通过减轻数据库负载来加速动态Web应用程序。
本质上,这允许你根据需要重新分配和重新分配内存。
如果你将内存的所有区域视为一个组合实体,那么随着你增加服务器和内存,你的内存池也会增加,从而实现更大的伸缩性和更高的流量处理能力。
Redis
Redis成立于2009年。它与memcached一样是开源的,可以做memcached能做的所有事情,而且还能做得更多一些。
根据其网站,Redis支持:
字符串、哈希、列表、集、带范围查询的排序集、位图、超日志、带RADIUS查询的地理空间索引和流。
stackoverflow.com有一个关于使用memcached与Redis的有趣讨论。
此外,许多缓存插件支持memcached或redis作为缓存存储,无论是用于全页缓存还是现有的wp对象缓存。
Varish
Varish的工作方式与memcached和redis不同。Varish Cache是一种Web应用程序加速器,也称为缓存HTTP反向代理。
它是为内容密集型动态网站和API设计的。
Varish允许缓存和加速网页,而无需修改任何代码或后端。
你可以将其安装在任何可以使用HTTP的服务器“前面”。当用户在你的站点上发出请求时,它会首先咨询Varish的服务器。
如果请求的结果存在,Varish将为该请求提供服务。如果它不存在,Varish将允许请求传递到站点服务器。
它将存储结果以备用户下次请求内容时使用。
由于请求首先通过Varish的服务器处理,因此可以加快加载速度。Varish还可以为桌面用户和移动用户存储单独的缓存-即使它是相同的URL。
缓存有什么缺点吗?
正如我们已经看到的,缓存是一个复杂的主题,你可以通过多种方式缓存你的网站或Web应用程序。
你选择的缓存策略和缓存类型可能会影响加载时间,但你需要小心。
如果缓存设置不正确,浏览器将无法验证缓存内容,页面可能会加载过时内容,这可能会影响用户体验。
由于缓存实体通常包括由多个用户共享的第三方代理服务器,因此如果缓存服务器的安全性受到损害,可能会影响连接到该服务器的所有用户。
有时,你可以对不同类型的缓存进行分层,效果会很好。
其他时候,复杂的缓存可能会对你的站点造成不必要的影响,例如向用户提供敏感数据(哎呀!)。或者将你的后端暴露给访问者(这太令人沮丧了!)。
使用不同种类的缓存运行基准测试可以帮助你对应该使用哪些缓存做出明智的选择,并避免出现问题。