我正在使用 predis(如果有什么区别的话,可以使用 laravel)php 客户端来与 Redis 一起工作。
我需要从 Redis 获取与特定前缀匹配的所有键,我这样做:
$keys = [];
foreach (new Iterator\Keyspace($this->redis(), Cache::KEY_PREFIX.'*') as $key) {
$keys[] = $rate_key;
}
使用这些键完成操作后,操作会重复 - 我将在循环中再次获取这些键。
我注意到经过几次迭代后,某些键未包含在 $keys 数组中。
最奇怪的是,消失的键在下一次迭代中永远不会出现。重新启动 php 进程(它是一个守护进程)可以解决该问题。
我使用 Redis 3.0.2 与 Predis 1.0 和 PHP 5.4
附:在键的循环中,我更改了其中一些键的值。不过,我不会删除任何键。
的确!这是因为 SCAN 就是这样工作的,引用 Redis 文档:
然而,虽然像 SMEMBERS 这样的阻塞命令能够在给定时刻提供属于 Set 的所有元素,SCAN 命令系列仅提供有限的保证关于返回的元素,因为我们增量迭代的集合可能会在迭代过程中发生变化。
然而,由于 SCAN 关联的状态非常少(只有光标),因此它具有以下缺点:给定元素可能会多次返回。由应用程序来处理重复元素的情况,例如,仅使用返回的元素来执行多次重新应用时安全的操作。
所以你可能想使用想要使用array_unique($键) http://php.net/manual/fr/function.array-unique.php之后foreach
.
要理解为什么迭代会以这种方式工作,最好的办法就是阅读Redis 文档的这一部分 http://redis.io/commands/scan#scan-basic-usage.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)