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

时间:2012-08-09 12:23:03

标签: php performance file-io include

这是我昨天提出的问题的后续问题 - 有一条评论告诉我为什么不在数据库中存储'缓存',(我测试了一个文件夹架构,其中有数百万个文件夹分隔在不同的子文件夹中)到每个1000)开始让我考虑正确的解决方案。

1 million or more files in one folder, for include (cache)

基本上,为了更详细地说明这里:我有一个昂贵的计算,需要很多数据库查询。基本上,程序的每个请求都针对特定用户。对于每个用户,结果将始终完全相同(直到用户进行重大更改)。基本上,我在想:为什么每次有人访问此用户页面时都会执行此操作 - 如果我可以执行一次,并将其存储?

基本上,结果是一组不同的PHP对象,持有不同的数据/设置/等等。所以我在考虑创建一个.inc文件,它创建那些对象(具有预定义的值,由SELECT的)。每当有人要求特定用户时,我只需快速include即可解决问题。

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

我想我在这里找错了方向。我有什么可能性?

  1. 选择数据并计算/在每次调用时将其放在一起 - 总是有相同的结果
  2. 与2.相同,但将结果对象存储在文件中,作为代码段 - 包括
  3. 与2.相同,但序列化生成的对象,将它们保存在文件或数据库中,在每次调用页面时对它们进行反序列化
  4. 是否有其他解决方案/方法可以解决此类问题?所有这些解决方案在我自己的耳朵听起来都不太干净,但我很难找到另一种方法来做到这一点。持有8百万个文件,或者一遍又一遍地计算同样的东西 - 不知怎的,中间应该有东西。

    有什么建议吗?

    谢谢! - 请原谅我可怜的英语。

1 个答案:

答案 0 :(得分:0)

我认为这里有很多选择,但没有进一步的细节,很难选出最好的选项:

如果这些对象不太可能在他们自己的表中不断更改,那么可以将这些对象半缓存在数据库表中,如果在半缓存表中找不到结果,则只能进行昂贵的计算(也是将它放在半缓存表中)。您甚至可能希望有一个计划定期更新这些计划(如每晚),以利用服务器的停机时间。

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

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