4

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

当用户请求特定主题/线程时,该线程的所有答案都将显示给用户一个很长的用户名、用户图片、年龄、来自答案发布者的论坛帖子总数。

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

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

当这样的东西更新时,有没有什么聪明的方法来缓存页面/重新缓存它们?:)

预先感谢,菲舍尔

4

2 回答 2

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 这样的框架内置了这类东西。我会认真考虑使用框架。

于 2012-08-08T10:20:40.427 回答
0

有趣的话题!

我首先要看的是优化你的数据库——即使你不得不花钱升级硬件,它也会比引入缓存更容易、更便宜——更少的移动部件,更少的可能出错的事情......

如果您无法从数据库中挤出更多性能,那么我要考虑的下一件事就是对数据进行一点反规范化。例如,维护一个“reply_count”列,而不是计算针对每个主题的回复。这很丑陋,但减少了出错的机会 - 运气好的话,您可以本地化数据访问层中的所有逻辑。

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

如果您确实必须在页面上提供更多“最新”内容,您可能会在数据库访问级别引入缓存。过去,我构建了一个数据库访问层,它基于关于缓存结果多长时间的硬连线逻辑来缓存 SQL 查询的结果。在我们的例子中,我们构建了一个函数来调用数据库,它允许您指定查询(例如获取用户的帖子)、参数数组(例如用户名、日期来源)和缓存持续时间。数据库访问函数将根据查询和参数在缓存持续时间内缓存结果;如果缓存持续时间已过期,它将刷新缓存。这个方案是相当防错的——作为最终用户,你很少会注意到缓存导致的怪异,而且因为我们保持缓存时间相当短,所以它很快就解决了。

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

于 2012-08-08T20:06:08.040 回答