缓存昂贵的计算 - 正确的方法


Cache expensive calculations - The right way?

这是我昨天问题的后续 - 其中一条评论问我为什么不在数据库中存储"缓存",(以及我测试了一个文件夹架构,将数百万个文件夹拆分在不同的子文件夹中,每个子文件夹最多可容纳 1000 个)开始让我思考正确的解决方案。

一个文件夹中有 100 万个或更多文件,用于包含(缓存)

基本上,在这里更详细一点:我有一个昂贵的计算,需要许多数据库查询。基本上,程序的每个请求都针对特定的用户。对于每个用户,结果将始终完全相同(直到用户进行重大更改)。所以基本上,我在想:为什么每次有人访问这个用户页面时都要做这个操作——如果我能做一次,然后存储它?

基本上,结果是一组不同的PHP对象,保存不同的数据/设置/等。所以我正在考虑创建一个.inc文件,该文件创建这些对象(具有预定义的值,这将由 SELECT 产生)。每次有人呼叫该特定用户时,我只需快速include问题就解决了。

现在我不再那么确定该解决方案。这意味着,基本上每个用户都至少有一个.inc(可能有多个)文件要包含。这意味着,如果我对用户表的PK有一个UNSIGNED MEDIUMINT,我需要有一个文件夹结构来支持至少 8388607 * ~2 个文件(最坏的情况)。

我想我在这里搜索的方向错误。我有什么可能?

  1. 选择数据并计算它/将其放在每个页面调用上 - 始终具有相同的结果
  2. 与 2. 相同,但将生成的对象作为代码片段存储在文件中 - 包括
  3. 与 2. 相同,但序列化生成的对象,将它们保存在文件或数据库中,在每次页面调用时取消序列化它们

还有其他解决方案/方法可以解决此类问题吗?所有这些解决方案在我自己的耳朵里听起来都不太干净,但我正在努力寻找另一种方法来做到这一点。持有 800 万个文件,或者一遍又一遍地计算同样的事情 - 不知何故,应该介于两者之间。

有什么建议吗?

谢谢!- 请原谅我糟糕的英语。

我认为这里有很多选项适合您,尽管没有进一步的细节,很难选择最好的一个:

如果这些对象

不太可能在自己的表中不断变化,则可以在数据库表中半缓存这些对象,并且只有在半缓存表中找不到结果时才执行昂贵的计算(这也将其放置在半缓存表中)。您甚至可能希望有一个定期(如每晚)更新这些内容的时间表,以利用服务器上的停机时间。

您可以将结果存储在会话或 cookie 中,并根据需要进行检查,如果不存在,请从数据库中计算出来。

使用mySQL缓存来存储这些昂贵的计算,以便它们可能根据需要位于缓存中。这可能意味着您预热了预期访问者的缓存。