Php 如何在数据库存储的信息上最好地缓存计算出的度量
我明白了。愚蠢的问题。定期运行任何东西的标准方法是。您可以让它定期运行任何命令,包括PHP脚本 您还可以缓存帖子的分数,或者至少缓存分数中与其内容相关的部分,以提高效率。全文处理是昂贵的,因此从这个角度来看,分数当然值得缓存在数据库中 诀窍是找出如何实现它的方式,允许您根据内容和年龄为帖子打分,同时仍然允许您缓存帖子。我将创建一个根据内容计算的基本分数,然后缓存该分数。当您想要获得真实的分数时,您可以检索缓存的基本分数,并根据帖子的年龄对其进行调整 例如:Php 如何在数据库存储的信息上最好地缓存计算出的度量,php,database,caching,optimization,Php,Database,Caching,Optimization,我明白了。愚蠢的问题。定期运行任何东西的标准方法是。您可以让它定期运行任何命令,包括PHP脚本 您还可以缓存帖子的分数,或者至少缓存分数中与其内容相关的部分,以提高效率。全文处理是昂贵的,因此从这个角度来看,分数当然值得缓存在数据库中 诀窍是找出如何实现它的方式,允许您根据内容和年龄为帖子打分,同时仍然允许您缓存帖子。我将创建一个根据内容计算的基本分数,然后缓存该分数。当您想要获得真实的分数时,您可以检索缓存的基本分数,并根据帖子的年龄对其进行调整 例如: // fetch cached pos
// 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);
您目前正在遵循“如果可以计算就不要存储”策略,这是数据库设计课程的第一步
但是,如果“分数”不太可能频繁更改,则最好处理时间表上的所有条目,将其分数存储在数据库中,然后在页面加载时只提取分数最高的条目。您可以将结果缓存在数据库中,例如在“分数”字段中,然后在用户访问页面时,运行SQL select以查找任何分数为空的文章 SQL:
从得分为空的文章中选择*
计算这些分数并将其存储到关联的项目中,然后通过一个有序的select语句利用它们来查找要显示的项目,可能会限制要获取的项目数量,甚至完全通过缓存执行分页
注意:分数应该是绝对的,完全基于所讨论的文章,而不是相对于数据库中其他文章的内容
SQL:SELECT*FROM Articles ORDER BY Score
通过将缓存生成限制为只生成实际更改项目的事件,可以进一步提高效率。例如,您可以在提交新文章或编辑文章时调用缓存生成事件。实际上没有标准。有些系统每隔一段时间运行,如一天一次或一小时一次。其他的则在每次访问页面时运行。在后一种情况下,可以使用缓存来减少负载 这完全取决于算法的扩展效率、需要处理的帖子数量以及需要信息的频率。如果操作快速且便宜,那么每次访问初始版本的页面时都可以运行它。如果它在测试中足够快,并且没有减少服务器的内存使用,那么做更多的工作就是浪费时间。如果还不够好,可以考虑缓存结果、投资于更好的硬件或寻找改进代码的机会 如果结果不需要经常更改,只需安排一小时/分钟左右,并确保在发货前满足您的需要
在担心优化之前,通常最好先测试最简单的解决方案。无法从描述中确定您的算法是否有效;我们需要看到它的实施。你能编辑你的问题以显示代码吗?你能在你的帖子表中添加一个“分数”字段并单独定期更新吗?还是分数取决于访问它的人?我不是在寻找算法本身的效率,我已经在这个主题上做了很多研究,并将继续调整它。最后,我的问题更多的是关于如何高效地运行algo。我在数据库中保存了与每个帖子相关的分数。现在,这些分数在每个页面视图上都会更新。我知道这是非常低效的。这与问题无关。当然了。他问定期运行的标准方法是什么,即cron。他还要求提高他所做工作的效率,这是我文章的后半部分所涉及的。当我发表评论时,你的整个文章都包含了一行关于使用“cron”的内容——一点用处都没有。我最初错过了问题的最后一部分,并迅速编辑以涵盖它。既然它不再“没用”,请取消你的否决票。好吧,我的情况变得棘手了:时间。如果时间不是一个问题,那么我可以在每次对一篇文章进行投票时计算得分(例如),但由于内容中有新闻元素,今天的一篇文章比上周的一篇文章更有价值。因此,“可以通过将缓存生成限制为实际更改项目的事件来进一步提高效率。”——简单地说,时间的流逝会改变它。是否可以使用一个按时间更改分数的存储过程,并在排序之前在select语句中对报告的分数调用它?它会降低一些效率,但仍然比根本不缓存要好得多。