保存平均值与每次请求计算它

时间:2013-07-27 17:19:00

标签: mysql concurrency playframework-2.0

我正在开发一个评级地点的系统,这是我的问题。假设我的数据库中有表格,如下所示:

places : id, name, description
place_marks : id, user_id, place_id, value, comment

当用户对地方进行研究时,我想向他发送按照费率desc排序的地方列表。实现这一目标的最佳方法是什么?

解决方案1 ​​

  1. 获取与名称相对应的所有地点
  2. 对于每个地方,计算标记
  3. 创建新的有序列表
  4. 解决方案2

    1. places
    2. 中添加标记
    3. 每次用户添加标记时,我都会计算标记
    4. 对于搜索,我只需要正确查询数据库
    5. 在解决方案1中,问题可能是性能问题(即使我在查询中计算了标记),在解决方案2中,如何在计算标记时确保避免冲突?

      我正在使用Play2和MySQL。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

你在解决方案2中害怕什么样的冲突?我假设你指的是你正在计算一个标记的可能性,同时提供了一个新标记,你再次开始相同的计算,其中第二个计算存储在第一个之前。换句话说,你没有最新的平均值。

在给出答案之前,我认为您应该以最简单的方式使用您的代码。只有在遇到问题时我才会考虑进行优化。在您真正受益于任何优化之前,您将需要相当多的标记和访问者(假设Web界面)。以后优化它是我的建议。

对于答案,我会考虑3种选择。我不知道Play2所以我保持我的答案通用。

1)不关心:这种情况发生的变化相当有限,只是流量非常高的问题。因为你只计算一个临时值(直到有新标记),我忽略了这种可能性。下次有人提供标记时,您的统计数据将是正确的。 1a)您可以每晚重新计算平均值,以确保它们在第二天正确。

2)确保计算同步。换句话说,确保永远不会同时开始2次计算。有多种选择,因为我不知道Play2我会提供更多信息。

3)这是最好的方法。由于您期望高流量,您希望确保您可以为您的客户提供服务。你想要的最后一件事是,例如将50%的CPU功耗用于计算。一种选择是在后台运行单独的进程,偶尔检查一次标记表。一旦检测到新标记,它将计算平均值。由于您只有一个进程,因此限制了它花费的CPU时间和数据库上的负载。在高负载期间,您可能在计算中有点惊悚,但是一旦负载降低,这将加速。

如果您真的想要繁忙的交通,请选择选项3)。根据您的问题,我建议您为您的产品选择选项1),调查选项2以了解有关例如信号量并考虑选项3)作为学习练习。

祝你好运。