具有多个标记的Laravel刷新缓存

时间:2017-06-22 07:23:51

标签: php caching redis laravel-5.2

我在Laravel 5.2上使用Redis缓存,我的密钥有2个标签(基本上),年份和来源。

示例:

$this->cache->tags(['online', 2016])->put("key1", $value1, 10));
$this->cache->tags(['online', 2016])->put("key2", $value2, 10));
$this->cache->tags(['online', 2017])->put("key3", $value3, 10));
$this->cache->tags(['online', 2017])->put("key4", $value4, 10));

$this->cache->tags(['database', 2016])->put("key5", $value5, 10));
$this->cache->tags(['database', 2016])->put("key6", $value6, 10));
$this->cache->tags(['database', 2017])->put("key7", $value7, 10));
$this->cache->tags(['database', 2017])->put("key8", $value8, 10));

我想刷新标签的缓存2016&在线。

使用此$this->cache->tags(['online', 2016])->flush();它会使用任何标记清除所有内容,即online 2016(在这种情况下key1,key2,key3,key4,key5,key6)。

我想删除所有内容,包括所有标记,即 online2016(在这种情况下只有key1和key2)

2 个答案:

答案 0 :(得分:2)

所以这需要一些挖掘,但这是判决。

是的,技术上可能(最好的可能吗?)

首先,RedisTaggedCache(负责在redis中实现标记)将所有标记成员键存储在redis集中。以下是如何发现它的位置以及如何获取所有键:

function getAllTagKeys($cache,$tags) {
    $tagStore = new TagSet($cache->getStore(),$tags);
    $key = "<prefix>:{$tagStore->getNamespace()}:". RedisTaggedCache::REFERENCE_KEY_STANDARD;//use REFERENCE_KEY_FOREVER if the keys are cached forever or both one after the other to get all of them
    return collect($cache->getRedis()->smembers($key));
}

然后你可以这样做:

getAllTagKeys($this->cache, ["online"])
    ->insersect(getAllTagKeys($this->cache, ["2016"]))
    ->each(function ($v) {
         $this->cache->getRedis()->del();
     });

这看起来像是一种可怕的方式。也许向Laravel提出功能请求更明智,因为这看起来像是他们应该暴露的东西?

答案 1 :(得分:2)

我想我会为删除做个钥匙...

$this->cache->tags([andKey('online', 2016)])->put("key1", $value1, 10)); 
$this->cache->tags([andKey('online', 2016)])->put("key2", $value2, 10));
    
$this->cache->tags([andKey('online', 2016)])->flush();

helper:
function andKey($a, $b)
{
   return sprintf("%s.%s", $a, $b);  
}

需要更多工作,但是当更改缓存系统时,将减轻工作量。

编辑: 如注释中所建议,您可以添加所有键并在任何3个键上刷新。

$this->cache->tags(['online', '2016', andKey('online', 2016)])->put("key1", $value1, 10)); 
$this->cache->tags(['online', '2016', andKey('online', 2016)])->put("key2", $value2, 10));
   
$this->cache->tags([andKey('online', 2016)])->flush();

helper:
function andKey($a, $b)
{
   return sprintf("combined.%s.%s", $a, $b);  
}