繁体   English   中英

Redis扫描跳过键

[英]Redis scan skipping keys

我正在使用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一起使用

PS在循环键中,我更改了其中一些的值。 但是,我没有删除任何键。

确实! 这是因为SCAN以这种方式工作,引用Redis文档:

但是,虽然像SMEMBERS这样的阻塞命令能够在给定的时间内提供Set中所有元素, 但是SCAN系列命令仅对返回的元素提供有限保证 ,因为我们递增迭代的集合可以在迭代过程中更改。

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

因此,您可能要在foreach之后使用想要使用array_unique($ keys)的方法。

要了解为什么迭代如此工作,最好的方法是阅读Redis文档的这一部分

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM