2016-01-28 2 views
3

Можно ли стереть все ключи в redis с помощью Laravel, которые соответствуют определенной строке? Например, если бы я хотел забыть ключи, которые имеют продукты слово, было бы забыть следующие ключи:Laravel - удалить все ключи кеша/redis, содержащие определенную строку

Laravel: 896235872385237588327582370375acaca235325: продукты-лист Laravel: 896235872385237588327582370375acaca235325: продукты-категории

Я бы запустить это на сервер Redis, но мне интересно, если есть что-нибудь лучше, чем можно было бы запустить через Laravel непосредственно:

redis-cli keys "*" | grep "products" | xargs redis-cli DEL

ответ

6

Почему нет:

public function forget($key_name) 
{ 
    $redis = Cache::getRedis(); 
    $keys = $redis->keys("*$key_name*"); 
    $count = 0; 
    foreach ($keys as $key) { 
     $redis->del($key); 
     $count++; 
    }  
    return $count; 
} 

И для производственной среды СКАН курсора [MATCH шаблон] [число COUNT] следует использовать вместо "ключей"

http://redis.io/commands/scan

Поскольку вы не хотите исчерпывать память, если у вас есть десятки тысяч ключей в redis, и вы не хотите блокировать все свои redis ins используя клавиши.

+0

Я не понимаю, как это по-другому концептуально? – StackOverflowed

+0

Ваше решение: получить все ключи от redis до PHP (может быть сто тысяч), а затем фильтровать, мое решение: сделать фильтрацию на стороне redis. –

0

Так я понял, способ сделать это - не то, что вы хотите делать слишком часто, потому что ему использует ключи Redis команды:

public function forget($key_name) 
    { 
     $redis = Cache::getRedis(); 
     $keys = $redis->keys("*"); 
     $count = 0; 
     foreach ($keys as $key) { 
      if (strpos($key, $key_name)) { 
       $redis->del($key); 
       $count++; 
      } 
     }  
     return $count; 
    } 
+0

Нет. Не делайте этого. Используйте «SCAN» вместо клавиш. –

Смежные вопросы