Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在数据库存储的信息上最好地缓存计算出的度量_Php_Database_Caching_Optimization - Fatal编程技术网

Php 如何在数据库存储的信息上最好地缓存计算出的度量

Php 如何在数据库存储的信息上最好地缓存计算出的度量,php,database,caching,optimization,Php,Database,Caching,Optimization,我明白了。愚蠢的问题。定期运行任何东西的标准方法是。您可以让它定期运行任何命令,包括PHP脚本 您还可以缓存帖子的分数,或者至少缓存分数中与其内容相关的部分,以提高效率。全文处理是昂贵的,因此从这个角度来看,分数当然值得缓存在数据库中 诀窍是找出如何实现它的方式,允许您根据内容和年龄为帖子打分,同时仍然允许您缓存帖子。我将创建一个根据内容计算的基本分数,然后缓存该分数。当您想要获得真实的分数时,您可以检索缓存的基本分数,并根据帖子的年龄对其进行调整 例如: // fetch cached pos

我明白了。愚蠢的问题。

定期运行任何东西的标准方法是。您可以让它定期运行任何命令,包括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);

您目前正在遵循“如果可以计算就不要存储”策略,这是数据库设计课程的第一步


但是,如果“分数”不太可能频繁更改,则最好处理时间表上的所有条目,将其分数存储在数据库中,然后在页面加载时只提取分数最高的条目。

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

SQL:
从得分为空的文章中选择*

计算这些分数并将其存储到关联的项目中,然后通过一个有序的select语句利用它们来查找要显示的项目,可能会限制要获取的项目数量,甚至完全通过缓存执行分页

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

SQL:
SELECT*FROM Articles ORDER BY Score


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

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

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

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


在担心优化之前,通常最好先测试最简单的解决方案。

无法从描述中确定您的算法是否有效;我们需要看到它的实施。你能编辑你的问题以显示代码吗?你能在你的帖子表中添加一个“分数”字段并单独定期更新吗?还是分数取决于访问它的人?我不是在寻找算法本身的效率,我已经在这个主题上做了很多研究,并将继续调整它。最后,我的问题更多的是关于如何高效地运行algo。我在数据库中保存了与每个帖子相关的分数。现在,这些分数在每个页面视图上都会更新。我知道这是非常低效的。这与问题无关。当然了。他问定期运行的标准方法是什么,即cron。他还要求提高他所做工作的效率,这是我文章的后半部分所涉及的。当我发表评论时,你的整个文章都包含了一行关于使用“cron”的内容——一点用处都没有。我最初错过了问题的最后一部分,并迅速编辑以涵盖它。既然它不再“没用”,请取消你的否决票。好吧,我的情况变得棘手了:时间。如果时间不是一个问题,那么我可以在每次对一篇文章进行投票时计算得分(例如),但由于内容中有新闻元素,今天的一篇文章比上周的一篇文章更有价值。因此,“可以通过将缓存生成限制为实际更改项目的事件来进一步提高效率。”——简单地说,时间的流逝会改变它。是否可以使用一个按时间更改分数的存储过程,并在排序之前在select语句中对报告的分数调用它?它会降低一些效率,但仍然比根本不缓存要好得多。