缓存数百万网页的最佳方式

Best Way To Go About Caching Millions of Web Pages

我正在尝试想出一个稍微简单的解决方案来对数百万页的内容进行两周的缓存。每次点击一个页面时,有问题的网站都会点击 MYSQL 一些具有更复杂查询的页面需要 2-3 秒的加载时间,我的最终目标是将加载时间缩短到一秒以下。我正在考虑使用 Memcached,但我想尽可能避免这种方法。我基本上更喜欢一个解决方案,它可以抓取所有有问题的页面并每两周自动创建一个新缓存。我对包括使用服务在内的所有方法持开放态度。

Memcached 或 Redis 是存储 "projected formats of data" 的完全可行的解决方案,需要大量的 JOINs、GROUP BYs 或 ORDER BYs MySQL.

但是,即使访问像Memcached或Redis这样的缓存,代码仍然需要访问。在大规模情况下,对于大量数据,PHP 运行时间和您的网络服务器可能成为瓶颈。

清漆来拯救

您确实提到了术语 页面 ,这意味着您实际上是在尝试缓存完整页面而不仅仅是数据集。在那种情况下,我建议您看看 Varnish.

Varnish 是一种反向缓存代理,专门用于大规模缓存页面。您可以使用爬虫来预热缓存,并且可以利用 Cache-Control headers 来控制缓存中 object 的 Time To Live .

这是一个将 HTTP 响应的 TTL 设置为 2 周 的示例:

Cache-Control: public, s-maxage=1209600

您还可以将 TTL 设置得更高,然后通过 purging 使缓存中的特定 object 无效。

缓存数百万 objects

Varnish 完全能够缓存数百万 object,甚至数十亿。可行性主要取决于 HTTP 响应的大小,以及系统的内存量。

默认情况下,Varnish 将其 object 存储在内存中。 Varnish 中的一个可配置参数是分配的内存量。您可以轻松地将系统内存的 80% 分配给 Varnish 进程。在缓存中存储 object 的开销仅为 1 KB 每个 object.

如果您缓存的 object 只是纯文本,应该没有问题。如果它是二进制数据(例如:图像),那么您可以 运行 很快内存不足。

运行内存不足并不是灾难性的:LRU机制将确保当缓存已满时,最近最少使用 object 被删除以清除 space.

结论

Varnish 已成为页面缓存的事实上的 标准。 网站上的用户指南 是快速学习如何设置和配置 Varnish 的重要资源。