7

概括

当我查看 stackoverflow 和网络时,我发现普遍缺乏关于缓存使用会话的高性能站点的最佳实践的良好文档。如果我们可以围绕一些基本构建块分享一些想法,尤其是在缓存方面,那将会很有帮助。出于本次讨论的目的,我将避免使用 memcache,而是专注于静态和完全生成的页面的缓存。

所以要设置场景,想象一个 Web 服务器(比如 nginx)、反向代理(比如 varnish)、应用服务器(随便)、数据库服务器(比如 mysql)。

匿名的

  1. 静态项目(gif/jpg 等)
  2. 半动态 (js/css)
  3. 动态的

登录

  1. 静止的
  2. 半动态 (js/css)
  3. 动态的

一般来说,所有的 Anon 都应该是可缓存的,并且大部分都是 Logged In(忽略动态,暂时没有 ESI)。

匿名 #1

  • 设置遥远的过期时间
  • 如果可能,设置 ETag
  • 缓存控制:max-age=315360000

Anon #2 (如果动态生成,则反向代理缓存结果,否则 Anon #1 规则适用)

  • 缓存控制:公共,s-maxage=3000

匿名 #3

  • 缓存控制:公共,s-maxage=300

登录 #1

  • 设置遥远的过期时间
  • 如果可能,设置 ETag
  • 缓存控制:max-age=315360000

Logged In #2 (如果动态生成,则反向代理缓存结果,否则 Logged In #1 规则适用)

  • 缓存控制:公共,s-maxage=3000

登录 #3

  • 缓存控制:s-maxage=0,必须重新验证

你有什么建议?当答案出现时,我会更新帖子。

4

4 回答 4

2

我对缓存一无所知,但这里有一些建议:

Anon #1,2:(静态、半动态项目) 您可以将它们设置为永不过期。如果您需要更改它们,请更改它们的 URL。If-modified-since 检查很便宜,但不是免费的。

Anon #3:(动态项目) 这就是 ETags 和/或 Last-Modified 派上用场的地方。根据您提供的服务,您可以生成一个好的 Last-Modified 标头。如果您的数据库存储了您计划显示的所有项目的修改日期,您可以使用SELECT MAX(last_updated) FROM items_to_show. 警告:这考虑了数据的年龄,而不是模板的年龄,因此如果您更改了 django 模板,您将不知道如何在标头中进行通信。

或者你可以用 ETag 做类似的事情。它可能是生成的内容的校验和。这将考虑到模板的更改。

这两种缓存动态内容的方法需要注意的是,它们确实比 Web 服务器/数据库加载节省了更多的带宽。您始终可以明智地使用 Expires 标头,以帮助在页面更改是周期性且可预测的情况下提供帮助。

我对登录内容的建议是相似的,除了我会查看 Vary 标题。这可以向缓存代理发出信号,表明不会为不同的登录用户提供相同的内容。

一般来说,我会使用 ETag 或 Last-modified,但不会同时使用两者。

于 2009-04-09T15:03:58.060 回答
2

我对此的最佳回答是,您对所有静态文件都有很多选择,它们可以以自己的方式产生很多收益,在特定情况下每种都有好处,因此请根据您的具体需要权衡利弊.

然而,大多数人忽略的是他们的动态内容,确保缓存数据库结果等很棒,但仍然涉及实际启动 PHP/ASP 的解析引擎或其他什么。

如果您查看 wordpress 的超级缓存插件,您会注意到它能够将您的 html 实际准备为静态文件。不仅如此,它还制作了一个 gzip 副本,并使用重写规则来检查这些文件是否存在,作为启动解析器的适当替代方法。这显然会给您带来最好的结果,因为它不仅可以节省您的处理时间,还可以节省带宽。

如果您想查看性能差异,请将 apachebench 的结果<?php die('hello world');与提供静态 .html 页面的结果进行比较。

显然,您需要小心使用这种缓存,但是从 PHP 等解释器内部替换整页缓存可能非常有用。

于 2009-07-29T09:52:17.473 回答
1

在ySlow pages上有一些相关的建议。

Etags显然不是一个好主意。

于 2009-04-16T08:21:20.580 回答
0

我建议阅读Scalable Internet Architectures有几章专门讨论通过缓存、CDN 等进行扩展。它应该为您指明正确的方向。帮助我扩大了我非常支持的网站。

--

于 2009-04-17T00:12:01.697 回答