caching - 缓存数百万网页的最佳方法

标签 caching memcached varnish

我正在尝试提出一种简单的解决方案,以对数百万个页面的内容进行为期两周的缓存。每次访问页面时,有问题的站点都会访问MYSQL,某些查询更复杂的页面需要2-3秒的加载时间,我的最终目标是将加载时间缩短到一秒钟以下。我当时正在考虑使用Memcached,但如果可能的话,我想避免使用这种方法。我基本上希望使用一种解决方案,该方案可对所有有问题的页面进行爬网,并每两周自动创建一个新的缓存。我愿意接受所有方法,包括使用服务。

最佳答案

Memcached或Redis是用于存储“投影数据格式”的完美可行的解决方案,在MySQL中,这种格式需要大量的JOINGROUP BYORDER BY

但是,即使访问诸如Memcached或Redis之类的缓存,仍必须访问该代码。在大规模情况下,对于大量数据,PHP运行时和您的Web服务器可能会成为瓶颈。

抢救 Varnish

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

Varnish是一种反向缓存代理,旨在专门用于大规模缓存页面。您可以使用搜寻器来预热缓存,还可以利用Cache-Control header 控制缓存中对象的生存时间。

这是将HTTP响应的TTL设置为2周的示例:
Cache-Control: public, s-maxage=1209600
您还可以将TTL设置得更高,然后通过purging使特定对象在缓存中无效。

缓存数百万个对象

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

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

如果您缓存的对象只是纯文本,应该没有问题。如果它是二进制数据(例如图像),则可能会很快耗尽内存。

内存用完并不是灾难性的:LRU机制将确保在缓存已满时,删除“最近最少使用”的对象以清除空间。

结论

Varnish已成为页面缓存的事实上的标准。 user guide on the website是快速学习如何设置和配置Varnish的重要资源。

关于caching - 缓存数百万网页的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60262016/

相关文章:

swing - JTable + TableModel 缓存获取事件以进行延迟实例化?

android - 使用 Android Universa Image Loader Library 设置图像缓存的生命周期

java - Memcached 的 Java UDP 套接字客户端接收超时

caching - Varnish和ESI,性能如何?

ruby-on-rails - 欺骗 Rails 应用程序使其认为它在不同的端口上

java - 从 Android 上的 Web 服务缓存 JSON - 模式?

ios - 使用storeCachedResponse存储在缓存中后,未检索到URLresponse

php - Thrift能否在php中维护Memcached持久连接

google-app-engine - 如何在GAE中有效实现session?

caching - 需要帮助分析 VarnishStat 结果