Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用predis扫描时的无限循环_Redis_Predis - Fatal编程技术网

使用predis扫描时的无限循环

使用predis扫描时的无限循环,redis,predis,Redis,Predis,我试图替换predis for scan中的keys函数,以提高我们所做的某些解析的性能 问题是,当我执行扫描操作时,它似乎陷入了一个无限循环,这毫无意义,因为根据redis文档,扫描完成后,迭代器将返回0 $it = null; $keysFound = []; do { $redisKeys = $redis->scan($it,"*{$query}", 10); if (!empty

我试图替换predis for scan中的keys函数,以提高我们所做的某些解析的性能

问题是,当我执行扫描操作时,它似乎陷入了一个无限循环,这毫无意义,因为根据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}");
我什么都试过了,请帮帮我

更新 在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,所以我不知道它是否与错误的配置有关

解决
问题是,我们有大量的键,因此将计数值增加到更大的数量可以得到正确的结果。

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

$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);
请参阅以了解响应

但是看看迭代器,因为您可能正在重新发明轮子(取自,添加了
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);
请参阅以了解响应

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


我尝试了第一个选项,但是当keys返回内容时,我仍然得到空结果,还有其他想法吗?在一些扫描调用中没有得到keys是可以的。您是否尝试过在redis cli上使用scan命令来排除可能出现的问题?您可以在Redis cli上使用try MONITOR命令并运行php代码,查看是否有任何差异Hi LeoMurillo感谢您的回复,我尝试了Redis cli命令(我无法尝试使用MONITOR,因为生产部门执行了太多的Redis调用,无法看到某些内容)。我刚刚更新了帖子,如果你能看一下的话,我会很感激的。x_dashboard_dashboard_row_1005_251没有模式匹配通配符,所以整个空间中只会检索到一个密钥。只要你有一个光标,你的扫描就会进行。看,你甚至可以根据第一个选项计算进度的百分比,但是当keys返回我的内容时,我仍然得到空结果,还有其他想法吗?在一些扫描调用中没有得到任何键是可以的。您是否尝试过在redis cli上使用scan命令来排除可能出现的问题?您可以在Redis cli上使用try MONITOR命令并运行php代码,查看是否有任何差异Hi LeoMurillo感谢您的回复,我尝试了Redis cli命令(我无法尝试使用MONITOR,因为生产部门执行了太多的Redis调用,无法看到某些内容)。我刚刚更新了帖子,如果你能看一下的话,我会很感激的。x_dashboard_dashboard_row_1005_251没有模式匹配通配符,所以整个空间中只会检索到一个密钥。只要你有一个光标,你的扫描就会进行。请参见,您甚至可以基于光标计算进度百分比