それはそう!これは、Redisのドキュメントから引用してSCANがそのように機能するためです:
ただし、SMEMBERSのようなブロッキングコマンドは、特定の瞬間にセットの一部であるすべての要素を提供できますが、SCANファミリーのコマンドは限定的な保証しか提供しません 増分的に反復するコレクションは反復プロセス中に変更される可能性があるため、返された要素について。
ただし、SCANには状態がほとんど関連付けられていないため(カーソルのみ)、次の欠点があります。特定の要素が複数回返される場合があります。重複した要素の場合を処理するのはアプリケーション次第です たとえば、複数回再適用した場合に安全な操作を実行するために、返された要素のみを使用します。
したがって、 array_unique($ keys)を使用したい場合があります foreach
の後 。
反復がそのように機能する理由を理解するには、Redisドキュメントのこの部分を読むのが最善です。 。