openxtrem/cache

OpenXtrem 缓存

5.0.2 2024-06-03 14:01 UTC

README

实现 PSR-16 缓存链(通常称为 链式缓存)。

此缓存允许委托对其他 PSR-16 适配器的调用,旨在提供对性能控制的极大灵活性(相对于所搜索的 的可访问性)。

此适配器使用三种不同的层概念,即

  • INNER:表示所谓的 请求内层,即此层内的 不会在两个 HTTP 请求之间持久化(它将在第一个请求结束时过期)。这是一个称为 静态 的缓存,并且非常高效。
  • OUTER:表示所谓的 请求间层服务器内层,其中 将在两个请求之间持久化。请注意,此层中的 应仅在一个服务器内持久化。这是缓存的传统用途(例如:RAM、文件系统等)。
  • DISTR:表示所谓的 服务器间层,其中 在多个请求和多个服务器之间持久化。这是一个称为 分布式 的缓存,并且由于网络调用而通常是最慢的(例如:Redis、Memcache 等)。

因此,当使用 LayeredCache 时,例如使用 LayeredCache::get 方法,适配器将首先在其 INNER 层中搜索 ,然后如果不存在,则在 OUTER 层中,依此类推。

这种方法的优点是,当在 DISTR 层中找到 时,LayeredCache 将使用 LayeredCache::set 方法将这些层(此处为 OUTER 然后 INNER)中的 值,以优化未来的调用。

初始化

初始化方法如下

<?php

use Ox\Components\Cache\Adapters\APCuAdapter;
use Ox\Components\Cache\Adapters\ArrayAdapter;
use Ox\Components\Cache\Adapters\PredisAdapter;
use Ox\Components\Cache\LayeredCache;
use Predis\Client;

LayeredCache::init('namespace')
    ->setAdapter(LayeredCache::INNER, new ArrayAdapter())
    ->setAdapter(LayeredCache::OUTER, new APCuAdapter())
    ->setAdapter(LayeredCache::DISTR, new PredisAdapter(new Client()));

需要一个 命名空间 来避免潜在的命名冲突(例如在共享服务器上)。

三个 PSR-16 适配器被提供给 LayeredCache,每个适配器都有相应的层。从最有效到最“持久”

  • INNER:静态 PHP 缓存;
  • OUTER:APCu 内存缓存;
  • DISTR:Redis 分布式缓存。

获取 LayeredCache 实例

层组合

这种系统的优点在于可以预先选择所需的缓存层。

层由 LayeredCache 类的常量表示,并在获取缓存实例时提供。

因此,初始化仅包含 INNEROUTER 层的 LayeredCache 实例如下

<?php

use Ox\Components\Cache\LayeredCache;

$cache = LayeredCache::getCache(LayeredCache::INNER | LayeredCache::OUTER);

或更简单地说

<?php

use Ox\Components\Cache\LayeredCache;

$cache = LayeredCache::getCache(LayeredCache::INNER_OUTER);

带压缩

还提供了一个允许对缓存数据进行压缩的装饰器。

当适配器检索 的内容时,它将自动解压缩(如果需要),而不管是否启用了压缩器。

在分配值给 时初始化压缩

<?php

use Ox\Components\Cache\LayeredCache;

$cache = LayeredCache::getCache(LayeredCache::INNER_OUTER)->withCompressor();

因此,使用 LayeredCache::setLayeredCache::setMultiple 方法分配的值将被压缩。

分配元数据

可以在初始化时插入每个适配器的元数据。

<?php

use Ox\Components\Cache\Adapters\APCuAdapter;
use Ox\Components\Cache\Adapters\ArrayAdapter;
use Ox\Components\Cache\Adapters\PredisAdapter;
use Ox\Components\Cache\LayeredCache;
use Predis\Client;

LayeredCache::init('namespace')
            ->setAdapter(LayeredCache::INNER, new ArrayAdapter(),              ['namespaced' => false, 'engine' => 'PHP Array', 'engine_version' => 'N/A'])
            ->setAdapter(LayeredCache::OUTER, new APCuAdapter(),               ['namespaced' => false, 'engine' => 'APCu',      'engine_version' =  phpversion('apcu')])
            ->setAdapter(LayeredCache::DISTR, new PredisAdapter(new Client()), ['namespaced' => false, 'engine' => 'Redis',     'engine_version' =  '6.2']);

可以从以下方法中获取它们

<?php

use Ox\Components\Cache\LayeredCache;

$cache    = LayeredCache::getCache(LayeredCache::NONE);
$metadata = $cache->getMetadata();

仅在内部使用元数据 namespaced(默认为 false),以指示 LayeredCache 是否使用其适配器中的某个适配器进行独立处理。

默认提供的适配器

以下适配器被提供

  • NullAdapter:不执行任何操作,用于测试目的。
  • ArrayAdapter:使用静态PHP数组作为适配器,非常高效,用于缓存 INNER
  • FileAdapter:将缓存项记录在指定的目录中的文件中。
  • APCuAdapter:使用非常高效的 APCu
  • PredisAdapter:使用 Predis 客户端,用于分布式缓存。