使用模式键从Laravel 4缓存中删除?

Hai*_*ood 13 php caching laravel laravel-4

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

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

所以,我需要一种方法去Cache::forget('mypackage-*')或类似,这可能吗?

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

har*_*ryg 15

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

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

Cache::tags('myPackage')->put('config', $config, $minutes);
Cache::tags('myPackage')->put('md5ofafilename', $md5, $minutes);
Run Code Online (Sandbox Code Playgroud)

(您也可以使用tags与方法remember,foreverrememberForever)

什么时候刷新包的条目缓存就行了

Cache::tags('myPackage')->flush();
Run Code Online (Sandbox Code Playgroud)

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

$myConfig = Cache::tags('myPackage')->get('config');
Run Code Online (Sandbox Code Playgroud)

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


Lau*_*nce 11

易于使用 Cache::getMemory()

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

ps不要手动取消'缓存'文件的链接.Laravel缓存会保留数组中所有缓存记录的记录,因此即使您将其取消链接,它也会期望文件存在.

  • getMemory()仅适用于memcache (3认同)
  • 这会引发一个"错误":{"type":"ErrorException","message":"call_user_func_array()期望参数1是一个有效的回调,类'Illuminate \\ Cache \\ MemcachedStore'没有方法' getMemory' " "文件": "\ /用户\/ericcumbee\/桌面\/phpprojects\/ sblitz\/供应商\/laravel\/框架\/src目录\ /照亮\ /缓存\ /Repository.php","对于使用memcached的Laravel 4.2中的行":277}"错误 (2认同)
  • 有点晚了,但是......不再支持getMemory()了. (2认同)

Kaz*_*zik 6

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

使用KEYS

$redis = Cache::getRedis();
$keys = $redis->keys("*");

foreach ($keys as $key) {
  if (strpos($key, 'mypackage') !== false)
  {
    $redis->del($key);
  }
}
Run Code Online (Sandbox Code Playgroud)

使用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;
}
Run Code Online (Sandbox Code Playgroud)

  • 强烈建议不要使用`KEYS`,因为它是一个O(N)命令(即你可以通过运行它来触发DoS以及在准备应答缓冲区时耗尽服务器的RAM).从v2.8开始,推荐的方法是使用`SCAN`命令. (2认同)