Бесконечный l oop при использовании предисмотра SCAN - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь заменить функцию клавиш из predis для сканирования, чтобы повысить производительность при некотором анализе, который мы выполняем.

Проблема в том, что когда я выполняю операцию сканирования, кажется, что она попадает в бесконечное l oop, что не имеет смысла, потому что согласно документации redis сканирование вернет итератор к 0, когда это будет сделано.

        $it = null;
        $keysFound = [];

        do {

            $redisKeys = $redis->scan($it,"*{$query}", 10);

            if (!empty($keys)) {
                array_merge($keysFound, $redisKeys);
            }
        } while($it != 0);

Я просто хочу заменить его, поэтому мы этого не делаем

$keys = $redis->keys("*{$query}");

Я перепробовал все, пожалуйста, помогите.

ОБНОВЛЕНИЕ Проверка на клик Я вижу, что он никогда не находит ключ и остается в l oop, даже если я поставлю точное тот же ключ, который я вижу в redsmin.

127.0.0.1:6379> scan 122880 MATCH x_dashboard_dashboard_row_1005_251 
1) "118784"
2) (empty list or set)
127.0.0.1:6379> scan 118784 MATCH x_dashboard_dashboard_row_1005_251 
1) "18432"
2) (empty list or set)
127.0.0.1:6379> scan 18432 MATCH x_dashboard_dashboard_row_1005_251 
1) "59392"
2) (empty list or set)
127.0.0.1:6379> scan 59392 MATCH x_dashboard_dashboard_row_1005_251 
1) "63488"
2) (empty list or set)
127.0.0.1:6379> scan 63488 MATCH x_dashboard_dashboard_row_1005_251 
1) "123904"
2) (empty list or set)
127.0.0.1:6379> scan 123904 MATCH x_dashboard_dashboard_row_1005_251 
1) "19456"
2) (empty list or set)
127.0.0.1:6379> scan 19456 MATCH x_dashboard_dashboard_row_1005_251 
1) "121856"
2) (empty list or set)
127.0.0.1:6379> scan 121856 MATCH x_dashboard_dashboard_row_1005_251 
1) "115200"
2) (empty list or set)
127.0.0.1:6379> scan 115200 MATCH x_dashboard_dashboard_row_1005_251 
1) "119296"
2) (empty list or set)
127.0.0.1:6379> scan 119296 MATCH x_dashboard_dashboard_row_1005_251 
1) "109056"
2) (empty list or set)
127.0.0.1:6379> 

Есть что-то, что может быть неправильно настроено? Раньше я никогда не работал с Redis, поэтому не знаю, может ли это быть связано с неправильной конфигурацией.

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

1 Ответ

0 голосов
/ 15 января 2020

Если вы хотите выполнить сканирование самостоятельно, вам нужно захватить возвращенный курсор из ответа:

$it = null;
$keysFound = [];

do {

    $response = $redis->scan($it,"*{$query}", 10);

    $it = $response[0];
    $redisKeys = $response[1];

    if (!empty($keys)) {
        array_merge($keysFound, $redisKeys);
    }
} while($it != 0);

См. https://redis.io/commands/scan, чтобы понять ответ.

Но взгляните на итераторы, так как вы можете заново изобретать колесо (взято из Как использовать SCAN с опцией MATCH в Predis , добавлено count):

use Predis\Collection\Iterator;

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

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