Php Redis扫描跳过键

Php Redis扫描跳过键,php,laravel,redis,predis,Php,Laravel,Redis,Predis,如果php客户端与Redis配合使用有什么不同,我将使用predis和laravel 我需要从Redis获取与特定前缀匹配的所有密钥,我的操作如下: $keys = []; foreach (new Iterator\Keyspace($this->redis(), Cache::KEY_PREFIX.'*') as $key) { $keys[] = $rate_key; } 使用这些键的工作完成后,操作将重复-我将在循环中再次获取这些键。 我注意到经过

如果php客户端与Redis配合使用有什么不同,我将使用predis和laravel

我需要从Redis获取与特定前缀匹配的所有密钥,我的操作如下:

$keys = [];
    foreach (new Iterator\Keyspace($this->redis(), Cache::KEY_PREFIX.'*') as $key) {
        $keys[] = $rate_key;
    }
使用这些键的工作完成后,操作将重复-我将在循环中再次获取这些键。 我注意到经过几次迭代后,$keys数组中没有包含一些键

最奇怪的是,消失的关键点在下一次迭代中永远不会出现。重新启动php进程(它是一个守护进程)可以修复该问题

我在Predis1.0和PHP5.4中使用Redis3.0.2


另外,在循环键中,我更改了其中一些键的值。不过,我不会删除任何密钥

确实如此!这是因为SCAN就是这样工作的,引用Redis文档:

然而,尽管像SMEMBERS这样的阻塞命令能够在给定时刻提供作为集合一部分的所有元素,但SCAN命令族仅对返回的元素提供有限的保证,因为我们增量迭代的集合可以在迭代过程中更改

但是,由于扫描仅与光标关联的状态很少,因此它有以下缺点: 给定的元素可以返回多次。由应用程序来处理重复元素的情况,例如,仅使用返回的元素来执行多次重新应用时安全的操作

因此,您可能希望在foreach之后使用want to use

要理解迭代为何以这种方式工作,最好的方法是阅读