2

Redisと連携するために、predis(違いがある場合はlaravelを使用)phpクライアントを使用しています。

特定のプレフィックスに一致するすべてのキーを Redis から取得する必要があり、次のようにします。

$keys = [];
    foreach (new Iterator\Keyspace($this->redis(), Cache::KEY_PREFIX.'*') as $key) {
        $keys[] = $rate_key;
    }

これらのキーでの作業が完了したら、操作が繰り返されます。ループ内で再びそれらのキーを取得しています。数回繰り返した後、一部のキーが $keys 配列に含まれていないことに気付きました。

最も奇妙なことは、消えたキーが次の反復で表示されないことです。php プロセス (デーモン) を再起動すると、問題が解決します。

Predis 1.0 および PHP 5.4 で Redis 3.0.2 を使用しています

PSキーのループ内で、それらのいくつかの値を変更します。ただし、キーは削除しません。

4

1 に答える 1

4

それはそう!これは、Redis のドキュメントから引用して、SCAN がそのように機能するためです。

ただし、SMEMBERS のようなブロッキング コマンドは、特定の時点で Set の一部であるすべての要素を提供できますが、 SCAN ファミリーのコマンドは、返された要素について限られた保証しか提供しません。 .

ただし、SCAN には状態がほとんど関連付けられていないため (カーソルのみ)、次の欠点があります 。 特定の要素が複数回返される場合があります。重複した要素のケースを処理するのはアプリケーション次第です。たとえば、複数回再適用されたときに安全な操作を実行するために、返された要素のみを使用します。

したがって、の後にarray_unique($keys)を使用したい場合がありますforeach

繰り返しがなぜそのように機能するのかを理解するには、Redis ドキュメントのこの部分を読むのが一番です。

于 2015-08-04T11:53:09.243 に答える