在PHP/Redis上有很好的缓存标签解决方案吗?


Is there good solution for cache tagging on PHP/Redis?

我正在寻找在Redis中存储缓存的简单方法,并使用tags标记缓存块,因此当我需要时,我可以轻松删除所有标有特定标签的缓存。

有没有现成的解决方案?(我将使用访问Redis与PHP)

我会自己做,因为我知道我需要将标签存储为集合,其中值是缓存的键,使用标签。我甚至可以覆盖的情况下,当我删除缓存,它的键应该从标签的集合中删除(我可以存储在缓存元素的标签列表)。但我不知道如何做到这一点,当缓存过期,在这种情况下,它的关键将"卡"在一个标签和下次当我删除缓存的标签-它将清理缓存与关键,其中关键可能不再使用。

所以我正在寻找现成的解决方案,至少看看它是如何完成的。

你可以用照亮'缓存来实现这一点,它是Laravel的一部分,尽管可以单独使用。

为了配置它,你需要安装以下编译器库:

  • predis/predis
  • 照亮/复述,
  • <
  • 照亮/缓存/gh>

下面是一个例子:

<?php
require_once __DIR__ . '/vendor/autoload.php';
$servers = [
    'cluster' => false,
    'default' => [
        'host'     => '127.0.0.1',
        'port'     => 6379,
        'database' => 0,
    ],
];
$redis = new Illuminate'Redis'Database($servers);
$cache = new Illuminate'Cache'RedisStore($redis);
$cache->tags('posts', 'author_1')->put('post_1', 'Post 1 by Author 1', 1);
$cache->tags('posts', 'author_2')->put('post_2', 'Post 2 by Author 2', 1);
var_dump($cache->tags('posts', 'author_1')->get('post_1'));
var_dump($cache->tags('posts', 'author_2')->get('post_2'));
$cache->tags('author_2')->flush();
var_dump($cache->tags('posts', 'author_1')->get('post_1'));
var_dump($cache->tags('posts', 'author_2')->get('post_2'));

结果将是:

php test.php 
string(18) "Post 1 by Author 1"
string(18) "Post 2 by Author 2"
string(18) "Post 1 by Author 1"
NULL

我会自己做,因为我知道我需要将标签存储为集合,其中值是缓存的键,使用标签。

如果你不限制Redis可用的内存(通常对缓存可用的内存有硬限制),这将有效。因为如果Redis将删除包含键的集合,并留下这些键,你将无法通过标签删除它们。

解决方案:

  • 确保有足够的内存用于缓存
  • 将集合放到不同的Redis实例中,这没有内存限制
  • 把集合放到完全不同的地方(比如DB)
  • 不使用标签,使用redis哈希http://redis.io/commands/hset创建命名空间(你可以通过一个"标签"分组你的键)。

请注意,您需要4.2版本的照亮包才能正常工作:Predis不需要。

"require": {
    "illuminate/redis": "^4.2",
    "illuminate/cache": "^4.2"
},