使用 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) {
...
}
我正在尝试替换 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) {
...
}