【问题标题】:Redis scan skipping keysRedis 扫描跳过键
【发布时间】:2015-10-26 00:10:24
【问题描述】:

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

附:在键的循环中,我更改了其中一些键的值。但是,我不会删除任何键。

【问题讨论】:

    标签: php laravel redis predis


    【解决方案1】:

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

    然而,虽然像 SMEMBERS 这样的阻塞命令能够在给定时刻提供属于 Set 的所有元素,SCAN 系列命令仅提供有限的保证关于自集合以来返回的元素我们增量迭代可以在迭代过程中改变。

    但是,由于 SCAN 关联的状态非常少(只有光标),它具有以下缺点: 一个给定的元素可能会被多次返回。由应用程序处理重复元素的情况,例如,仅使用返回的元素以执行多次重新应用时安全的操作。

    所以你可能想在foreach之后使用array_unique($keys)。

    要了解迭代为什么会这样工作,最好阅读this part of the Redis documentation。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2013-05-14
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多