【问题标题】:How to best cache calculated metrics on database-stored information如何最好地缓存数据库存储信息的计算指标
【发布时间】:2012-02-29 02:12:36
【问题描述】:

想通了。愚蠢的问题。

【问题讨论】:

  • 你的算法是否有效无法从描述中确定;我们需要看到它的实施。您可以编辑您的问题以显示代码吗?
  • 您能否在您的帖子表中添加一个“分数”字段并定期单独更新?还是分数取决于谁在访问它?
  • 我并不是在寻找算法本身的效率,我已经对这个主题进行了大量研究,并将继续对其进行调整。最终,我的问题更多是关于如何有效地运行算法。我有与保存在数据库中的每个帖子相关的分数。现在,这些分数在每个页面视图上都会更新。我知道这是非常低效的。

标签: php database caching optimization


【解决方案1】:

您可以将结果缓存在数据库中,例如在“分数”字段中,然后在用户访问该页面时,运行 SQL 选择以查找任何分数为空的文章。

SQL:SELECT * FROM Articles WHERE Score IS NULL

计算这些分数并将它们存储到相关的文章中,然后通过有序的选择语句使用它们来查找要显示的文章,可能会限制要获取的文章数量,甚至完全通过缓存执行分页。

注意:分数应该是绝对的,完全基于相关文章,而不是相对于数据库中其他文章的内容。

SQL:SELECT * FROM Articles ORDER BY Score

可以通过将缓存生成限制为仅实际更改文章的事件来进一步提高效率。例如,您可以在提交新文章或编辑文章时调用缓存生成事件。

【讨论】:

  • 好吧,这就是我的情况变得棘手的地方:时间。如果时间不是问题,那么我可以在每次对文章进行投票时计算分数(例如),但由于内容中有新闻元素,今天的文章比上周的文章更有价值。因此,“可以通过将缓存生成限制为仅实际更改文章的事件来进一步提高效率。” -- 只是时间的流逝改变了它。
  • 可能使用按时间更改分数的存储过程,并在订购前在选择语句中报告的分数上调用它?它会在一定程度上降低效率,但仍然比完全不缓存要好得多。
【解决方案2】:

真的没有标准。一些系统按一定时间间隔运行,例如每天一次或每小时一次。其他人在每次访问页面时运行。在后一种情况下,可以使用缓存来减少负载。

这完全取决于算法的扩展效率、需要处理的帖子数量以及需要信息的频率。如果该操作既快速又便宜,那么您也可以在每次访问初始版本的页面时运行它。如果它在您的测试中足够快并且不会杀死服务器的内存使用,那么做更多的工作就是浪费时间。如果还不够好,请考虑缓存结果、投资购买更好的硬件或寻找改进代码的机会。

如果结果不需要经常更改,只需每小时/每分钟左右安排一次,并确保在发货前满足您的需求。

通常最好先测试最简单的解决方案,然后再考虑优化。

【讨论】:

    【解决方案3】:

    您目前正在遵循作为数据库设计课程的第一步教授的“如果你能计算就不要存储”的策略。

    但是,如果“分数”不太可能经常更改,那么最好按计划处理所有条目,将它们的分数存储在数据库中,然后只提取最高的- 页面加载时计分的项目。

    【讨论】:

      【解决方案4】:

      定期运行任何东西的标准方法是cron。您可以让它定期运行任何命令,包括 PHP 脚本。

      您还可以缓存帖子的分数,或者至少是与其内容相关的部分分数,以提高效率。全文处理成本很高,因此从这个角度来看,分数当然值得缓存在数据库中。

      诀窍是弄清楚如何以一种允许您根据内容和年龄对帖子进行评分的方式来实现它,同时仍然允许您缓存它。我将创建一个根据内容计算的基本分数,然后将其缓存。当您想获得真实分数时,您可以检索缓存的基础分数并根据帖子的年龄进行调整。

      例子:

      // fetch cached post score, which doesn't take time into account
      $base_score = get_post_base_score($post_id);
      // now adjust the base score given how old the post is
      $score = adjust_score($base_score, time() - $post_time);
      

      【讨论】:

      • 这与问题无关
      • 当然可以。他在问定期运行事物的标准方法是什么,即 cron。他还询问如何提高他正在做的事情的效率,这是我帖子的后半部分所涉及的。
      • 当我发表评论时,您的整篇文章都包含一行关于使用“cron”的内容——一点用处都没有。
      • 我最初错过了问题的最后一部分,并快速编辑以覆盖它。由于它不再“无用”,请删除您的反对票。
      猜你喜欢
      • 1970-01-01
      • 2015-11-10
      • 2014-07-17
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2010-09-15
      相关资源
      最近更新 更多