2015-02-16 1 views
7

Я ранее использовал команду KEYS для поиска ключей, соответствующих определенному шаблону, в моей базе данных Redis. Так как Redis 2.8, команда SCAN кажется предпочтительной по сравнению с KEYS, поскольку она возвращает итератор вместо сканирования всего пространства ключей сразу.Как использовать SCAN с опцией MATCH в Predis

Я использую Predis> = 0.8.5, который должен поддерживать итераторы PHP для команды SCAN. Predis не имеет много документации, поэтому мне интересно, как перевести следующую KEYS команды это SCAN аналога:

$client->keys($pattern) 

Я попытался следующий:

$client->scan('MATCH', $pattern); 

Какого вида работает, но он не возвращает собственный PHP-итератор. Было бы очень полезно использовать встроенную поддержку итератора Predis.

ответ

15

Я нашел, как это сделать в Predis examples directory.

Чтобы использовать SCAN для поиска соответствующих ключей в базе данных, вы просто использовать Predis\Collection\Iterator\Keyspace класс:

use Predis\Collection\Iterator; 

$client = ...; 
$pattern = 'foo*'; 

foreach (new Iterator\Keyspace($client, $pattern) as $key) { 
    ... 
} 

Видимо Predis имеет класс итератора в Predis\Collection\Iterator для каждой из команд, которые возвращают итераторы:

  • Keyspace для SCAN
  • HashKey для HSCAN
  • SetKey для SSCAN
  • SortedSetKey для ZSCAN
  • ListKey для LRANGE - Это на самом деле не использовать Redis итераторы, но это хороший интерфейс LRANGE в любом случае.
0

Может быть, это полезно для других начинающих Predis и вы приезжаете из PHP/MySQL фон, как я вы можете использовать это:

foreach (new Iterator\HashKey($client, $pattern) as $index => $value) { 
    ... 
} 

Когда сгенерированный ранее набор данных массива с $client->hmset($index, $array).