【问题标题】:Two PHP Caching Techniques两种 PHP 缓存技术
【发布时间】:2019-07-19 18:31:38
【问题描述】:

让我们想象一下,您是一个流行的 CMS 的创建者,它是用 PHP 编写的。它被许多人使用,用于许多网站。现在让我们谈谈缓存技术。服务类中有一个函数 (getItemByHandle) 可以从数据库的特定表中获取特定项目。

就整体表现而言,你更愿意

  • 编写数据库查询以获取此特定项目并按句柄缓存它,
  • 或者,您是否更愿意获取所有项目、缓存它们,然后使用 PHP 中的 foreach 循环过滤所需的项目?

这两种技术都只会为当前请求缓存它。数据库输出仅存储在 PHP 变量中。所以没有像 Key-Value-Store 这样的进一步缓存技术。

第一种技术只会缓存已经获取的项目。每个具有不同句柄的 getItemByHandle(...) 调用都会导致新的数据库命中。

然而,第二种技术只会访问数据库一次(每个请求),但这也意味着来自数据库的流量更多,PHP 的工作量更大。因此,如果表中有数千个条目,它会为每个请求获取所有条目,但不会在同一请求中的进一步 getItemByHandle(...) 调用中访问数据库。

我问是因为也许还有其他方面需要考虑,这里没有描述。

【问题讨论】:

    标签: php mysql performance caching


    【解决方案1】:

    数据库查询越少越好。

    如果您可以检索整个数据集,并且您确定您的内存有足够的大小。所以你的第二个选择是最好的。

    但是,如果您的数据集太大而无法将其存储在内存中,那么请使用多查询的第一个选项。

    【讨论】:

      【解决方案2】:

      通常,PHP 脚本会在每次调用时重新开始。这是因为 HTTP 本质上是“无状态的”。这意味着缓存页面之间是不可能的。

      有一些涉及“会话”变量的杂项,当“用户”完成其页面时,这些杂项就会消失。

      MySQL 旨在(通常)执行您需要的所有缓存。当然,有可能将糟糕的 CMS 查询写入数据库,从而使 CMS “变慢”。我认为这是草率的代码,而不是缺少缓存。

      如果您的数据集足够小,可以缓存所有内容,那么查询(没有缓存)可能足够快,以至于您无法测量速度差异。

      如果数据集很大,你会发现过早缓存是愚蠢的,你的尝试将会失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 2011-06-13
        • 1970-01-01
        相关资源
        最近更新 更多