我在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)。
我想删除所有内容,包括所有标记,即 online
和2016
(在这种情况下只有key1和key2)
答案 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);
}