在PHP中缓存辩论/论坛条目

时间:2012-08-08 09:37:13

标签: php mysql caching

只是寻找一条建议。在我们的一个网页上,我们有一个辩论/论坛网站。每当用户请求辩论页面时,他/她将获得所有主题的列表(以及他们的答案数等)。

当用户请求特定主题/帖子时,线程的所有答案都将向用户显示长的用户名,用户图片,年龄,答案海报中的总论坛帖子数。

每次访问页面时,都会使用MySQL查询检索所有内容。但是这开始变得非常缓慢(特别是对于大线程,+3000个答案)。

我想以某种方式缓存辩论条目,以加快这个过程。但问题是,如果我自己缓存条目,帖子等数量(当然是动态的),并不总是最新的。

当这样的内容更新时,是否有任何智能的方法来缓存页面/重新访问它们? :)

提前致谢, 费

2 个答案:

答案 0 :(得分:2)

您应该根据缓存的数据为缓存创建标记或名称。

例如,对于名为 Jake's Post 的帖子,您可以创建名称的md5,这将为您提供标签 49fec15add24931728652baacc08b8ee

现在使用 49fec15add24931728652baacc08b8ee 标记缓存内容以及与此帖相关的所有内容。更新帖子或添加评论后,请转到缓存并删除与 49fec15add24931728652baacc08b8ee 相关的所有内容。

现在没有缓存,当下一个访问者到达新帖子时,它将被重建。

您可以通过为每个帖子添加多个标签来进一步细分。例如,您可以为评论和答案添加标签,添加评论时删除评论标签,但不删除答案标签。这减少了服务器在重建缓存时必须完成的工作,因为现在只缺少注释。

有许多库和框架可以帮助您完成此任务。

杰克

修改

我使用文件来存储数据,更具体地说是页面的HTML输出。然后你可以做类似的事情:

if(file_exists($tag))
{
    // Load the contents of the cache file here and output it
}
else
{
    // Do complex database look up and cache the file for later
}

请记住像Zend这样的框架内置了这种东西。我会认真考虑使用框架。

答案 1 :(得分:0)

有趣的话题!

我要看的第一件事就是优化你的数据库 - 即使你不得不花钱升级硬件,它会比引入缓存更容易和更便宜 - 移动部件更少,可能出错的东西更少。 ..

如果你无法从数据库中挤出更多性能,我接下来要考虑的是将数据去标准化一点。例如,维护“reply_count”列,而不是计算针对每个主题的回复。这很难看,但引入错误的机会较少 - 运气好的话,您可以本地化数据访问层中的所有逻辑。

我要考虑的下一个选项是缓存页面。例如,如果你有合理的流量水平,只需缓存“辩论页面”30秒就可以大大降低数据库的负载,即使一切都出错了,因为你正在缓存整个页面,它会下次页面过时时将自己排除在外。在大多数情况下,缓存整个页面是可以的 - 如果新帖子在过去30秒内出现并且您没有在页面上看到它,那么这不是世界末日。

如果您确实需要在页面上提供更多“最新”内容,则可以在数据库访问级别引入缓存。在过去,我已经构建了一个数据库访问层,该层根据硬连线逻辑缓存SQL查询的结果,这些逻辑表示缓存结果的时间。在我们的例子中,我们构建了一个函数来调用数据库,该函数允许您指定查询(例如,获取用户的帖子),参数数组(例如用户名,日期来自)和缓存持续时间。数据库访问功能将根据查询和参数缓存缓存持续时间的结果;如果缓存持续时间已过期,它将刷新缓存。 这个方案是相当防错的 - 作为最终用户,你很少注意到由于缓存引起的怪异,并且因为我们将缓存周期保持得相当短,所以它们都很快就自行排序。

通过缓存内容片段来构建页面是可能的,但很快变得非常复杂。由于缓存策略不同,创建一个对最终用户毫无意义的页面非常容易 - 由于“摘要”和“摘要”之间的缓存策略不同,“未读帖子”不会累计细分中的帖子数量详情”。