对于我的包,我们使用Laravel缓存
我们创建的每个缓存键都带有前缀,因此我们得到mypackage-config
,mypackage-md5ofafilename
有时我需要刷新我的包创建的所有缓存文件,问题是什么?我只知道缓存键的模式,我不知道整个键!
所以,我需要一种方法去Cache::forget('mypackage-*')
或类似的,这可能吗?
如果只是我的系统,我知道我正在使用文件缓存,所以我可以手动取消链接文件,但因为它是一个通用包我不知道最终用户使用的缓存方法,我只是知道接口(也称为Laravel缓存接口)。
答案 0 :(得分:14)
另一种解决方案:只要你不使用文件或数据库缓存,就可以使用Cache Tags。
只需使用您的包名称标记每个缓存条目:
Cache::tags('myPackage')->put('config', $config, $minutes);
Cache::tags('myPackage')->put('md5ofafilename', $md5, $minutes);
(您还可以将tags
方法与remember
,forever
和rememberForever
一起使用
如果有时间刷新包裹条目的缓存,请执行
Cache::tags('myPackage')->flush();
注意:强> 当您需要访问缓存条目时,仍需要引用标记。 E.g。
$myConfig = Cache::tags('myPackage')->get('config');
这样,另一个密钥config
具有不同标记(例如hisPackage
)的缓存条目不会与您的冲突。
答案 1 :(得分:11)
易于使用Cache::getMemory()
foreach (Cache::getMemory() as $cacheKey => $cacheValue)
{
if (strpos($cacheKey, 'mypackage') !== false)
{
Cache::forget($cacheKey);
}
}
P.S。永远不要手动取消'缓存'文件的链接。 Laravel缓存会保留数组中所有缓存记录的记录,因此即使您将其取消链接,也会期望该文件存在。
答案 2 :(得分:6)
这是与接受的答案中相同的解决方案,但专门为Redis重写。
使用KEYS
$redis = Cache::getRedis();
$keys = $redis->keys("*");
foreach ($keys as $key) {
if (strpos($key, 'mypackage') !== false)
{
$redis->del($key);
}
}
使用SCAN(Redis> = 2.8.0)
$redis = Cache::getRedis();
$cursor = 0;
while($data = $redis->scan($cursor))
{
$cursor = $data[0];
foreach($data[1] as $key)
{
if (strpos($key, 'mypackage') !== false)
{
$redis->del($key);
}
}
}
if ($cursor == 0) break;
}
答案 3 :(得分:1)
这是Redis特定示例,用于根据给定前缀清除所有键。这是基于Kazik的答案,进行了一些重组并增加了安全性。
请注意,RedisStore位于名称空间Illuminate\Cache\RedisStore
$cacheDriver = Cache::driver();
if ($cacheDriver instanceof(RedisStore)) {
$cursor = 0;
do {
$data = $cacheDriver->scan($cursor);
$cursor = $data[0];
$cacheEntries = $data[1];
foreach ($cacheEntries as $key) {
// This clears based on prefix. Change according to your use case.
if (starts_with($key, Cache::getPrefix())) {
$redis->del($key);
}
}
} while ($cursor != 0);
}