我正在寻找在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"
},