两种PHP缓存技术

时间:2019-02-26 08:59:08

标签: php mysql performance caching

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

关于整体表现,您愿意

  • 编写数据库查询以获取此特定项目并按句柄对其进行缓存,
  • 或者,您是否希望获取所有项目,将其缓存,然后使用PHP中的foreach循环过滤所需的项目?

这两种技术都只会为当前请求缓存它。数据库输出仅存储在PHP变量中。因此,不再需要像Key-Value-Store这样的缓存技术。

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

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

我之所以问,是因为也许还有其他方面需要考虑,这里不再赘述。

2 个答案:

答案 0 :(得分:0)

数据库查询较少,更好。

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

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

答案 1 :(得分:0)

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

有一些涉及“会话”变量的错误,这些变量在“用户”完成其页面时消失。

MySQL旨在(通常)完成所需的所有缓存。当然,可以将可怕的CMS查询写入数据库,从而使CMS变慢。我认为这是草率的代码,而不是缺少缓存。

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

如果数据集很大,您会发现过早的缓存非常愚蠢,并且尝试将失败。