Redis key コマンドは、redis キーを管理するために使用されます。この記事では、Redis ですべてのキーを走査する 2 つの方法、KEYS パターンと SCAN カーソルを紹介します。
すべての Redis キーまたは指定されたモードのキーを走査する必要がある場合、最初に思い浮かぶのは KEYS コマンドです。公式 Web サイトには KEYS コマンドに関するヒントが記載されています: KEYS は非常に高速です。たとえば、Redis が 100 万個のキーを持つデータベースでクエリを実行するのに 40 ミリ秒かかります。ただし、大規模なデータベースで使用すると、依然としてパフォーマンスの問題が発生する可能性があるため、データ セットから特定の KEY を見つける必要がある場合は、代わりに Redis のコレクション構造 SETS を使用することをお勧めします。
KEYS コマンドの使用は非常に簡単です。
KEYS pattern
ただし、KEYS コマンドは一致するすべてのキーを一度に返すため、redis にキーが多すぎると、メモリ消費と redis サーバーに潜在的な危険が生じます。
Redis 2.8 の場合上記のバージョンでは、キーをトラバースするためのより優れたコマンド SCAN が提供されています。このコマンドの基本形式は:
redis> MSET one 1 two 2 three 3 four 4 OK redis> KEYS *o* 1) "four" 2) "one" 3) "two" redis> KEYS t?? 1) "two" redis> KEYS * 1) "four" 2) "three" 3) "one" 4) "two" redis>
SCAN です。各実行では少数の要素のみが返されるため、運用環境で使用できます。サーバーをブロックする可能性がある KEYS または SMEMBERS コマンドなどの問題。
SCAN コマンドはカーソルベースの反復子です。これは、コマンドが呼び出されるたびに、前の反復プロセスを継続するために、前の呼び出しによって返されたカーソルを呼び出しのカーソル パラメーターとして使用する必要があることを意味します。
When SCAN のカーソル パラメーターコマンド (カーソルなど) 0 に設定すると、サーバーは新しい反復を開始し、サーバーが値 0 のカーソルをユーザーに返すと、反復が終了したことを意味します。
簡単な反復のデモ:
SCAN cursor [MATCH pattern] [COUNT count]
上の例では、最初の反復ではカーソルとして 0 を使用し、新しい反復の開始を示します。 2 回目の反復では、最初の反復で返されたカーソル 17 を新しい反復パラメーターとして使用します。
明らかに、SCAN コマンドの戻り値は 2 つの要素を含む配列です。最初の配列要素は次の反復で使用される新しいカーソルで、2 番目の配列要素は別の配列です。この配列には、要素が反復されます。
注: 返されるカーソルは、必ずしもインクリメントしているわけではありません。返されるカーソルは、前のカーソルよりも小さくなる可能性があります。
SCAN コマンドが 2 回目に呼び出されるとき、コマンドはカーソル 0 を返します。これは、反復が終了し、データ セット全体が完全に走査されたことを示します。
完全な反復: カーソルとして 0 を使用して新しい反復を開始し、コマンドがカーソル 0 を返すまで SCAN コマンドを呼び出し続けます。このプロセスを完全なトラバーサルと呼びます。
SCAN 増分反復コマンドは、各実行で指定された数の要素が返されることを保証するものではなく、ゼロ要素を返す場合もありますが、コマンドによって返されるカーソルが 0 でない限り、アプリケーションはそのようなことを行うべきではありません。反復を完了したものとして扱います。
ただし、コマンドによって返される要素の数は常に特定のルールに準拠します。大規模なデータ セットの場合、増分反復コマンドは毎回最大数十の要素を返す可能性がありますが、十分に小さいデータ セットの場合は、 、すべてのキーが 1 回の反復で返される可能性があります
COUNT オプション
各反復で返される要素の数を保証しない増分反復コマンドの場合、動作に COUNT オプションを使用できます。コマンドをある程度調整しました。 COUNT オプションの目的は、各反復でデータ セットから返される要素の数をユーザーが反復コマンドに指示できるようにすることです。 COUNT オプションの使用は、増分反復コマンドのヒントと同等であり、ほとんどの場合、このヒントは戻り値の数を制御する上でより効果的です。
注: COUNT オプションは返されるキーの数を厳密に制御するものではなく、大まかな制約であるとしか言えません。各反復で同じ COUNT 値を使用する必要はありません。ユーザーは必要に応じて各反復の COUNT 値を変更できます。次の反復では、最後の反復から返されたカーソルを使用することを忘れないでください。
MATCH オプション
KEYS コマンドと同様に、増分反復コマンドは MATCH パラメーターを指定することで実装されます。グロブスタイルのモード パラメーターを指定すると、コマンドは指定されたモードのみを返します。要素。
MATCH オプションの要素のパターン マッチングは、コマンドがデータ セットから要素を取得した後、要素をクライアントに返すまでの期間中に実行されます。反復データセットが一致した場合、要素を返さずに反復コマンドが複数回実行される可能性があります。
以下はこの状況の例です:
redis 127.0.0.1:6379> scan 0 1) "17" 2) 1) "key:12" 2) "key:8" 3) "key:4" 4) "key:14" 5) "key:16" 6) "key:17" 7) "key:15" 8) "key:10" 9) "key:3" 10) "key:7" 11) "key:1" redis 127.0.0.1:6379> scan 17 1) "0" 2) 1) "key:5" 2) "key:18" 3) "key:0" 4) "key:2" 5) "key:19" 6) "key:13" 7) "key:6" 8) "key:9" 9) "key:11"
ご覧のとおり、上記の反復のほとんどは要素を返しません。最後の反復では、COUNT オプションのパラメーターを 1000 に設定して、コマンドがより多くの要素を返すように、この反復でより多くの要素を強制的にスキャンします。
SCAN のセキュリティに基づいて、運用環境では KEYS の代わりに SCAN コマンドを使用することをお勧めします。ただし、このコマンドはバージョン 2.8.0 以降に追加されたものであることに注意してください。このバージョンよりも古い場合は、Redis をアップグレードする必要があります。
以下では、PHP コードを使用して SCAN コマンドの使用方法を示しています:
redis 127.0.0.1:6379> scan 0 MATCH *11* 1) "288" 2) 1) "key:911" redis 127.0.0.1:6379> scan 288 MATCH *11* 1) "224" 2) (empty list or set) redis 127.0.0.1:6379> scan 224 MATCH *11* 1) "80" 2) (empty list or set) redis 127.0.0.1:6379> scan 80 MATCH *11* 1) "176" 2) (empty list or set) redis 127.0.0.1:6379> scan 176 MATCH *11* COUNT 1000 1) "0" 2) 1) "key:611" 2) "key:711" 3) "key:118" 4) "key:117" 5) "key:311" 6) "key:112" 7) "key:111" 8) "key:110" 9) "key:113" 10) "key:211" 11) "key:411" 12) "key:115" 13) "key:116" 14) "key:114" 15) "key:119" 16) "key:811" 17) "key:511" 18) "key:11" redis 127.0.0.1:6379>
実行結果:
[root@localhost php]# /usr/local/php/bin/php scan.php bm bm2 h1 name bit bm1 places cities hhl --------------------------------------------------------------------------------- bm bm2 h1 name bit bm1 places cities hhl
注意:如果php执行报错 请升级到较新版本的Redis扩展。
更多redis知识请关注redis入门教程栏目。
以上がすべてのキーを走査する Redis メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。