13

对于我的包,我们使用 Laravel 缓存,

我们创建的每个缓存键都有前缀,所以我们得到mypackage-configmypackage-md5ofafilename有时我需要刷新我的包创建的所有缓存文件,问题是什么?我只知道缓存键的模式,我不知道整个键!

所以,我需要一条路Cache::forget('mypackage-*')或类似的路,这可能吗?

如果只是为了我的系统我知道我正在使用文件缓存,所以我可以手动取消链接文件,但是因为它是一个通用包我不知道最终用户使用的是什么缓存方法,我只知道接口(又名 Laravel 缓存接口)。

4

4 回答 4

16

另一种解决方案:只要您使用文件或数据库缓存,您就可以使用Cache Tags

只需使用您的包名称标记每个缓存条目:

Cache::tags('myPackage')->put('config', $config, $minutes);
Cache::tags('myPackage')->put('md5ofafilename', $md5, $minutes);

(您也可以使用tags带有rememberforever和的方法rememberForever

当需要刷新包条目的缓存时,只需执行

Cache::tags('myPackage')->flush();

注意: 当您需要访问缓存条目时,您仍然需要引用标签。例如

$myConfig = Cache::tags('myPackage')->get('config');

这样,另一个config具有不同标签(例如hisPackage)的键的缓存条目不会与您的冲突。

于 2014-10-13T12:21:07.553 回答
12

易于使用Cache::getMemory()

foreach (Cache::getMemory() as $cacheKey => $cacheValue)
{
    if (strpos($cacheKey, 'mypackage') !== false)
    {
        Cache::forget($cacheKey);
    }
}

ps永远不要手动取消链接“缓存”文件。Laravel 缓存将所有缓存记录保存在一个数组中,因此即使您“取消链接”它,它也会期望该文件存在。

于 2013-02-14T11:35:56.993 回答
6

这是与接受的答案相同的解决方案,但专门为 Redis 重写。

使用键

$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;
}
于 2014-12-11T13:40:45.497 回答
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);
}
于 2017-06-30T06:24:18.243 回答