【问题标题】:Cache expensive calculations - The right way?缓存昂贵的计算 - 正确的方法?
【发布时间】:2012-08-09 12:23:02
【问题描述】:

这是对我昨天的问题的跟进 - 有一条评论问我为什么不将“缓存”存储在数据库中,(我测试了一个文件夹架构,其中有数百万个文件夹被拆分在不同的子文件夹中到 1000 个)开始让我开始思考正确的解决方案。

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

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

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

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

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

  1. 选择数据并计算它/在每次页面调用时将其放在一起 - 始终具有相同的结果
  2. 与 2. 相同,但将生成的对象存储在文件中,代码为 sn-p - 包含
  3. 与 2. 相同,但序列化生成的对象,将它们保存在文件或数据库中,并在每次页面调用时对其进行反序列化
  4. ?

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

有什么建议吗?

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

【问题讨论】:

    标签: php performance file-io include


    【解决方案1】:

    我认为这里有很多选项供您选择,但如果没有更多细节,很难选出最好的:

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

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

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

    【讨论】:

    • 感谢您的输入,他们帮助我测试了一些东西 - 我发现存储在数据库中毕竟不是正确的解决方案 - 直接查找已经压缩过的文件会更好避免数据库调用
    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多