【问题标题】:How to cache complex calculated temporary Data如何缓存复杂计算的临时数据
【发布时间】:2014-01-25 16:21:26
【问题描述】:

我有一个应用程序可以让人们投注足球比赛的结果。 通过将投注的投注分数与游戏中的实际结果(=实体)进行比较来计算每个单注的分数(=实体)。投注在 Betrounds 内投注。 Betrounds 是团体投注游戏组(游戏组,例如单个比赛日)的组织。单个用户组可以有多个投注轮。

总结一下关系模型: 用户组 1:N BetRounds 1:N 投注 N:1 游戏

在每个投注轮中,我都会创建一个结果表,在其中向每个用户显示他们的结果点和位置。 为了计算一个用户的位置,我需要计算一个投注轮中每个用户的积分。 来自单次投注的这些点被汇总到组中,并且在组内再次有一个结果表。

示例

  • 一个用户组:20 个用户
  • 一个赛季有 34 个比赛日
  • 一个比赛日有 9 场比赛

为了计算这个用户组的分数,我需要从 20*34*9=6120 赌注中计算分数。

由于计算量很大,我不想每次显示结果表时都这样做。 我目前看到两个选项以节省一些计算时间:

  1. 缓存
  2. 在数据库中保存中间结果(例如投注实体)
  3. 也许两者兼而有之。
  1. 缓存

如果缓存是正确的方法,我不确定在哪个级别以及如何使缓存无效。 有几个选项可以缓存什么: - 单注的积分结果 - 投注回合内单个用户的积分结果 - 下注的整个结果表(点数和位置) - 用户组内单个用户的pointresult - 用户组的整个结果表

我不确定如何缓存这些数据: - 只是位置和点的整数值 - 整个实体(例如赌注) - 临时非持久实体(例如,表示结果表) - 表格的html输出

然后取决于格式如何缓存它: - 可以通过反向代理缓存 html 视图 - 值/实体可能通过 redis / memcache 等。

将来我们可能会更改为仅通过 restapi 提供数据的单页应用程序,然后缓存 html 输出不是一种选择。

根据缓存策略,问题出现了如何使缓存无效并可选地对其进行加热,以便从不在应用程序内计算结果,而仅在缓存无效并立即被新结果替换时重新计算。

我经常读到缓存失效是邪恶的。我不确定这是否适用于我的用例,因为所有积分/结果/表格等仅在我的界面更新游戏结果时才会发生变化。这是唯一一次点数发生变化。

2.在数据库中保存中间结果(例如投注实体)

我不确定这种情况是否适用于所有级别。我首先想到的是保存投注的实际结果,而不是总是将投注分数与实际分数进行比较。这将使我的数据模型有点多余,如果我的界面获取了错误的结果并且后来正确的结果进来并且我的积分没有重新计算,我会增加复杂性。

在所有其他级别上,我需要创建新的临时实体来持久存储表结果。

3.两者的混合

我不确定两者混合会是什么样子以及是否有意义,但我认为这可能是一种选择。

我们将不胜感激任何建议、意见或经验。

【问题讨论】:

    标签: symfony caching redis memcached varnish


    【解决方案1】:

    我对博彩的了解略知一二,希望对您有所帮助。

    听起来你在问两个问题:

    1. 什么时候计算结果?
    2. 我应该使用多少缓存?

    在我看来,发生了非常明确的事件,之后您可以成功计算出结果。您的设计应该利用这一点并在本质上发生事件。您应该有可以检测游戏何时完成的后台进程。应写入游戏结果,并应触发额外的后台作业来计算依赖于该游戏的任何投注的结果。

    这也是涉及该游戏的任何缓存、该游戏的结果或对该游戏的任何投注的结果应该失效和/或刷新的点。

    你应该缓存多少应该取决于你需要缓存多少。缓存应与计算结果分开考虑。那不是缓存。那就是计算结果并存储它们。您绝对不应该在页面查看请求期间计算结果,并且应该在相应事件(游戏结束)触发计算时提前完成。

    您的数据库几乎应该始终代表您掌握的所有最新信息。如果可能,您应该避免在运行中进行任何计算。

    我会先让所有事件和背景工作正常工作,然后看看你会得到什么样的性能。那时,您的应用程序应该做的只是获取结果并将它们粘贴到每个页面视图的视图中。如果这部分速度太慢,那么您应该开始考虑缓存您的视图/模板/html。如前所述,当后台工作人员遇到新结果时,这些缓存可能会失效。

    【讨论】:

    • 嗨,所以对我来说,这意味着将投注结果保存在数据库中,并在基础游戏发生变化时更新该值。不应存储所有表,而应仅缓存输出(因此仅缓存部分视图,而不是原始数据,然后重新渲染)。这意味着我可以使用 github.com/asm89/twig-cache-extension 之类的东西,或者使用带有边缘的 Varnish。不幸的是,我的云提供商还没有提供清漆。所以我可能会在 twig 中使用缓存博客。
    猜你喜欢
    • 2016-01-19
    • 2023-03-18
    • 2015-02-23
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多