使用 predis SCAN 时无限循环

Infinite loop when using predis SCAN

我正在尝试替换 predis 中的键函数以进行扫描,以提高我们所做的某些解析的性能。

问题是,当我执行扫描操作时,它似乎陷入了无限循环,这是没有意义的,因为根据 redis 文档扫描完成后 return 迭代器将变为 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}");

我都试过了,请帮忙。

更新 检查 cli 我发现它永远找不到密钥并保持循环,即使我放置了与我在 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 值增加到更大的数量会得到正确的结果。

如果您想自己进行扫描,则需要从响应中捕获返回的游标:

$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 以了解响应。

但看看迭代器,因为您可能正在重新发明轮子(取自 ,添加 count):

use Predis\Collection\Iterator;

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

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