joefallon/phpcache

此包包含基于标签的缓存(仅限APC)。

v3.0.0 2016-08-22 03:56 UTC

This package is auto-updated.

Last update: 2024-09-25 23:14:02 UTC


README

Joe Fallon 编写

通常,缓存条目通过以下三种方法之一进行失效:

  1. 通过调用某种类型的 remove() 方法显式地删除缓存条目。
  2. 由于基于时间的过期而删除缓存条目。
  3. 由于需要为新条目腾出空间而删除缓存条目。

遗憾的是,这并不允许删除整个缓存条目组,因为它们依赖于一个共同的因素。例如,假设我们有一个博客,该博客有多个帖子。此外,假设已将所有帖子的列表添加到缓存中。让我们将帖子组的缓存键设置为 all_posts。另外,让我们给这个缓存条目添加一个名为 posts_table 的标签。

然后,假设我们缓存了一篇单独的帖子。让我们给它一个键 post_id_45。同样,给它一个标签 posts_table。所以现在我们有一个包含所有帖子的缓存条目,以及一个ID为45的帖子的缓存条目。如果我们删除ID为45的帖子,当然会从缓存中删除它。但是,我们也应该通过标签删除所有带有标签 posts_table 的缓存条目。这将删除前一段中的所有帖子列表。可能会有许多缓存条目依赖于帖子表的内容不改变。使用一个或多个标签来清除缓存条目组使缓存管理变得更加容易且更不容易出错。

安装

使用 Composer 安装 Joe 的 PHP Cache 是最简单的方法。创建以下 composer.json 文件,并运行 php composer.phar install 命令来安装。

{
    "require": {
        "joefallon/phpcache": "*"
    }
}

TaggedCache 类

TaggedCache 类允许使用简单的键/值缓存作为缓存后端。实际上,任何实现 Cacheable 的类都可以用作 TaggedCache 的缓存后端。目前,仅实现了APC。但是,添加更多是非常容易的,我期待着拉取请求。

除了标签之外,TaggedCache 还支持一些其他功能:

  1. 缓存可以命名空间,以便在后端中隔离多个缓存。
  2. 提供默认的以秒为单位的过期时间,以允许比后端默认过期时间更激进的缓存过期。这对于从外部Web服务检索的数据(例如,源)非常有用。
  3. 每个缓存条目都可以有自定义的过期时间。

可用方法

以下是 TaggedCache 中可用的方法列表:

store($key, $value, array $tags = null, $expiresInSeconds = null);
retrieve($key);
exists($key);
remove($key);
removeByTag($tag);
removeAll();

向缓存中添加和检索值

以下是将普通非标签值添加到标签缓存的示例:

use JoeFallon\Cache\ApcCache;
use JoeFallon\Cache\TaggedCache;

$cache = new TaggedCache(new ApcCache());   // use default namespace and expires

$key1   = 'key1';
$value1 = 'value1';

$cache->store($key1, $value1);

$key1Exists = $cache->exists($key1);
$value = null;

if($key1Exists)
{
    $value = $cache->retrieve($key1);
}
else
{
    $value = expensiveMethod();
}

向缓存中添加和删除带标签的值

以下是将带有与它关联的标签的缓存条目添加到缓存中,然后通过标签而不是通过键删除该缓存条目的示例

use JoeFallon\Cache\ApcCache;
use JoeFallon\Cache\TaggedCache;

$cache = new TaggedCache(new ApcCache());   // use default namespace and expires

$key1   = 'key1';
$value1 = 'value1';

$cache->store($key1, $value1, array('tag1', 'tag2'));
$cache->removeByTag('tag2');  // the cache entry for 'key1' is deleted

注意:在先前的示例中,所有带有标签 'tag2' 的条目都将被删除。