使用predis扫描时的无限循环
我试图替换predis for scan中的keys函数,以提高我们所做的某些解析的性能 问题是,当我执行扫描操作时,它似乎陷入了一个无限循环,这毫无意义,因为根据redis文档,扫描完成后,迭代器将返回0使用predis扫描时的无限循环,redis,predis,Redis,Predis,我试图替换predis for scan中的keys函数,以提高我们所做的某些解析的性能 问题是,当我执行扫描操作时,它似乎陷入了一个无限循环,这毫无意义,因为根据redis文档,扫描完成后,迭代器将返回0 $it = null; $keysFound = []; do { $redisKeys = $redis->scan($it,"*{$query}", 10); if (!empty
$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没有模式匹配通配符,所以整个空间中只会检索到一个密钥。只要你有一个光标,你的扫描就会进行。请参见,您甚至可以基于光标计算进度百分比