Matomo中的缓存

像所有软件一样,Matomo使用缓存来提高性能。本文档解释了Matomo使用的每一种类型的缓存,以及核心开发人员和插件开发人员如何使用它们。

瞬态缓存

瞬态cache是Matomo中最简单的缓存。它是内存中的缓存,在PHP数组中存储值。仅为当前请求缓存数据。

如果需要避免在单个请求中多次调用相同的、代价高昂的逻辑,则在请求中使用此缓存。例如,缓存API调用的结果以获得实体列表。在PHP中,您可能需要在多个位置使用该列表,但实际上只需要发出一次数据库查询。

更多信息请参见{@see Matomo\Cache\Backend\Transient::class}类。

懒惰的缓存

懒惰的缓存是一种按需请求和读取缓存数据的缓存。当您在Lazy缓存中缓存数据时,它将在请求之间可用,例如,在文件后端中,但直到被请求时才会被读取。

在后端,数据将存储在每个缓存键的一个条目中(例如,每个缓存键一个php文件)。

这种缓存对于需要跨请求可用,但不需要经常访问的缓存最有用。一个例子可能是一个HTTP请求的结果,或者一个发出HTTP请求的方法,这是在一个Controller动作中完成的。每次调用控制器动作时发出HTTP请求可能会使控制器动作看起来很慢,因此我们希望缓存结果。但是,我们在任何其他上下文中都不需要它,因此我们希望只有在需要数据时才访问缓存。Lazy缓存非常适合这一点。

更多信息请参见{@see Matomo\Cache\Backend\Lazy::class}类。

急切的缓存

急切的cache与Lazy cache类似,因为它可以使缓存数据在请求之间可用,但是Eager cache中的每个缓存数据都是在每个请求开始时加载的。

在后端,急切缓存数据将全部存储在单个条目中(例如,所有缓存数据都存储在单个php文件中)。这意味着只需要读取一个redis查询或文件来获取所有缓存数据。

此缓存对于需要跨请求缓存的数据非常有用,并且用于每个(或几乎每个)请求。当前安装的Matomo版本就是一个例子。每个请求都将检查当前安装的版本是否与已安装代码的版本相同。如果我们使用Lazy缓存,我们必须在每个请求上读取一个缓存条目,这将使每个Matomo请求稍微变慢。使用Eager缓存,我们不会向当前请求添加更多的负载,因为我们只会一次读取所有数据。

跟踪器缓存

跟踪器缓存是Matomo跟踪器使用的特殊缓存。Matomo跟踪器旨在以尽可能高的性能处理多个同时请求。由于用户可能每月追踪数百万次或更多的操作,我们需要尽可能地进行优化。

Tracker缓存主要用于避免与插入日志数据无关的任何类型的数据库查询。选项值和实体信息(如站点信息)都应该存储在跟踪器缓存中,因此,理想情况下,我们永远不会发出数据库查询来获取它。(最终缓存数据将变得陈旧,我们可能不得不再次查询它,但大多数请求将使用缓存数据。)

更多信息请参见{@see Piwik\Tracker\Cache}类。

缓存失效

当知道缓存中的数据不再有效时,必须使其失效。例如,如果更改了一个站点的可测量设置,并且在跟踪期间使用了该设置,则跟踪器:deleteCacheWebsiteAttributes ()必须调用。

每个单独的缓存类型都有不同的实现方式。

缓存后端

上述缓存类型都将数据存储在同一位置。这个位置由INI配置中指定的缓存后端决定。的(缓存)的后端选项决定数据保存的位置。可能的选项很简单:缓存到数组,缓存到文件,缓存到复述,

还有链接缓存是值得注意的。链式缓存允许使用多个后端。例如,缓存到一个数组,文件和redis。在这里,当请求数据时,我们首先检查它是否在数组后端,如果在那里,我们就使用它。如果不是,我们将检查文件后端,然后是redis后端。使用这个缓存,我们可以先进行成本较低的检查,从而节省时间。

缓存键

用于缓存数据的键必须是唯一的,以便将数据与可能被缓存的其他数据区分开来。例如,如果您的数据依赖于当前加载的站点,那么缓存ID必须通过包含idSite来反映这一点myData.1在哪里1为站点ID。否则,当idSite更改时,将使用或覆盖不同站点的数据。

Matomo包含一个实用工具类,可以用来帮助创建键:{@see Piwik\CacheId::class}。您可以使用以下方法轻松创建缓存键,并避免手动创建键时出现的一些微妙错误:

  • languageAware ():如果你的数据依赖于当前加载的语言,使用这个函数。
  • pluginAware ():如果你的数据取决于当前加载的插件,使用这个函数。
  • siteAware ():如果您的数据依赖于或多个站点,或当前请求的站点(换句话说,idSite查询参数),请使用此函数。

使用实例

方法的示例如下缓存类。

class Controller {/** * @var Lazy */ private Lazy $cache;公共函数__construct(Lazy $cache) {$this->cache = $cache;父:__construct ();}公共函数myExpensiveAction() {$idSite = Common::getRequestVar('idSite', $default = null, 'int');$cacheKey = \Piwik\CacheId::siteAware('myCacheData', $idSite);//注意:使用这种方法,我们首先获取,而不是使用contains,如果' false '不是有效的缓存值$data = $this->cache->fetch($cacheKey);if ($data === false) {$data = $this->doSomethingThatTakesALongTimeWithIdSite($idSite);$this->cache->save($cacheKey, $data, 24 * 60 * 60);}返回$data;}}

开发模式下的缓存

当启用开发模式时,我们避免了大多数缓存,以确保代码更改将直接应用,因为一些缓存仅在更新后失效。基本上,当开发模式开启时,我们使用数组缓存,即使我们设置了其他东西。

// config/environment/dev.php 'Matomo\Cache\Backend' => DI\autowire('Matomo\Cache\Backend\ArrayCache'),

如果我们关闭开发模式并在本地环境中设置文件系统缓存,则可以在tmp /缓存文件夹。

// config/config.ini.php [Development] enabled = 0 [Cache] backend = file .php [/config /config.ini.php

清除缓存

我们可以使用控制台命令轻松清空缓存:

。/控制台缓存:清楚
Baidu