openxtrem / cache
OpenXtrem 缓存
Requires
- php: 8.2.* | 8.3.*
- ext-apcu: ^5.1
- ext-zlib: *
- predis/predis: ^2.2
- psr/simple-cache: ^2.0
Requires (Dev)
- openxtrem/coding-standard: ^1.0.0
- phpunit/phpunit: 9.5.*
- symfony/var-dumper: ^5.4
- dev-main
- 5.0.2
- 5.0.1
- 5.0.0
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.1.0
- 3.0.0
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.3.7
- 1.3.6
- 1.3.5
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.8
- 1.2.7
- 1.2.6
- 1.2.5
- 1.2.4
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.9
- 1.1.8
- 1.1.7
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- dev-test/ci-php-multiple
- dev-feature/Compatibility_81_82
- dev-feature/php7.4-upgrade
- dev-feature/redis-adapter-ci-test
This package is auto-updated.
Last update: 2024-09-03 18:39:41 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
类的常量表示,并在获取缓存实例时提供。
因此,初始化仅包含 INNER 和 OUTER 层的 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::set
和 LayeredCache::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
是否使用其适配器中的某个适配器进行独立处理。
默认提供的适配器
以下适配器被提供