1

我们正在为一个频繁使用的网站设计缓存策略。该网站由动态和静态内容的混合组成。前端是PHP,中间层是Tomcat,后面是mysql。

仅通过 HTTPS 完成用户登录屏幕以保护凭据。之后,所有内容都通过纯 HTTP 提供。一些屏幕是特定于客户的(比如说他的最后一个订单),而其他屏幕对每个人都是通用的(最流行的产品、促销、规则等)。

鉴于预期的流量,很明显我们需要一个全面的缓存策略。所以我们正在考虑以下选项:

  1. 将 Squid 或 Varnish 放在 PHP 前面,并配置它来缓存所有公共内容,甚至是客户的订单提交表单
  2. 使用 PHP 的 memcached 缓存页面片段(如最流行的产品)
  3. 在中间层/tomcats 中实现缓存(即在将内容返回到 Web 服务器之前,尝试从本地缓存中获取它,例如 ehcache)
  4. 使用诸如 Zend Cache 之类的 PHP 级缓存并将页面片段存储在那里。这与我提到的第二个选项很接近,但它内置在 Zend 框架中。

我们可能会使用这些策略的组合。

所以问题是是否值得像 Varnish 一样添加前端缓存,还是只在里面使用 Zend Cache?


我忘记提及的另一个选项是使用 PHP 级别的缓存,例如 Zend Cache,并在那里存储页面的片段。这与我提到的第二个选项很接近,但它内置在 Zend 框架中。

所以问题是是否值得像 Varnish 一样添加前端缓存,还是只在里面使用 Zend Cache?

再次感谢,Philopator。

4

1 回答 1

1

我做过很多这样的项目,发现:

  • 创建(完整的)定制解决方案既困难又昂贵。幸运的是你找到了 Squid/Varnish、memcache 和 ehcache
  • 站点的动态行为差异很大,并且您最了解您的站点,因此设计特定的缓存策略是有意义的
  • 部署多层缓存是有意义的。但是,这会使您的站点的行为复杂化,因此您应该告诉与站点相关的每个人(例如业务)有关它的信息,并告诉您的工程师很多有关它的信息。
  • 想想你将如何调试问题。例如,添加表明所服务数据的新鲜度的标头,允许某些人清除或避免缓存
  • 定期检查不同缓存层的执行情况(例如,为您的 varnish 机器使用 nagios 插件)。
  • 在构建任何缓存之前测量性能问题的位置:)
  • 将某些对象缓存一小段时间已经是一个非常显着的改进

这些天我非常喜欢 Varnish:它是一个独立的层,不会使 Java/PHP 代码混乱,它快速且非常灵活。缺点是vcl中的配置有点太复杂了。

我通常在内存存储中使用 ehcache + 来避免小数据集的延迟(例如数据库查询或服务请求),并在有大量数据且缓存需要由多个节点共享时使用 memcached。

于 2011-02-10T23:41:36.630 回答