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

时间:2015-10-26 23:27:18

标签: php caching redis tagging

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

有没有一个好的即用型解决方案? (我打算用PHP访问Redis)

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

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

3 个答案:

答案 0 :(得分:4)

你可以使用Illuminate \ Cache来实现这一点,它是Laravel的一部分,虽然可以在它上面使用。

要进行配置,您需要安装以下编写器库:

  • predis / predis
  • 照射/ redis的
  • 照亮/高速缓存

以下是一个例子:

<?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

答案 1 :(得分:0)

  

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

如果您不限制Redis可用的内存(通常存在可用于缓存的内存的硬限制),这将起作用。因为如果Redis将删除包含键的组,并保留这些键,则无法通过标记删除它们。

解决方案:

  • 确保有足够的内存用于缓存
  • 将设置放在不同的Redis实例中,该实例没有有限的内存
  • 将套装置于完全不同的位置(如DB)
  • 不要&#39;使用taging,使用redis哈希值http://redis.io/commands/hset创建命名空间(您可以将键分组为一个&#34;标记&#34;)。

答案 2 :(得分:0)

请注意,您需要使用4.2版的Illuminate软件包才能使其正常工作: 不需要Predis。

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