Redisのコマンドを探す--scan

ディレクトリ

 

1、キーのキーコマンドの欠点

2、導入スキャンコマンド

3、スキャンの使用

4、より多くのスキャン指示

5、途中でストップ反復が可能

図6に示すように、反復の終わり

7、時間の複雑さ


1、キーのキーコマンドの欠点

    Redisのは、暴力キーを満たす特定のキーを支配することを、すべての文字列をリストするために使用される単純な手順を説明します。非常にシンプルなコマンドキーは、文字列が、が、2つの明らかな欠点定期的な単純なことができます:
    1)は、オフセット、限界パラメータは、キー条件の例の何百万人があるが満たされている場合、それが終了することなく、ブラシ全画面の文字列につながる可能性が、すべての時間スピットキーの条件を満たすように、存在しません。
    2)キーは、トラバーサルアルゴリズム、アルゴリズムの複雑さはO(N)であり、キー例の十数万人が存在する場合のRedisシングルスレッド、プログラム、実行順序であるため、この指令は、さらに閉塞を引き起こし、Redisのサービスカトンにつながるあります彼らは現在の命令までのキーの上に続けることができます前に、すべての命令は、他の命令を実行する必要があります。
    だから、本番環境では、一般的にキーコマンドをシールドされています。

2、導入スキャンコマンド

    SCANコマンドは、カーソルベースのイテレータです。ここでの意味は次のとおりです。コマンドを呼び出すたびに、前に反復プロセスを継続するためには、この呼び出しのカーソルパラメータとしてカーソルを返すために、コールを使用する必要があります。カーソルが設定されたスキャンコマンドパラメータが0である場合、サーバは、新たな反復を開始すると、ときに、サーバがユーザカーソルに0の値を返しRedisの反復が完了した表現は、これは、反復の終了を決定する唯一の方法ではなくによって戻り結果セットは、反復の端部が空であるかどうかを決定します
比較するとスキャンキーは、次のような利点があります。
    1)が、複雑さはO(N)であり、それは段階的カーソルを介して行われ、スレッドがブロックされないであろう。
    2)結果の最大数は毎回返さ制限パラメータ制御を提供する、唯一の指標限界反復増分コマンド(ヒント)は、返された結果は、多かれ少なかれであってもよいです。
    3)サーバは、カーソルの状態を保存する必要はありません、カーソルはクライアント整数スキャンカーソルの状態のみバックです。
------------
スキャンは、その欠点を持っています:
    1)返された結果が、これは非常に重要であり、繰り返しのクライアントのニーズをオーバーラップしてもよいです。
    2)トラバーサルデータ変更時に、データがトラバース変化に不確実であることができない場合。すなわち、要素が反復プロセスでのデータセットに追加された場合、であるか、または、この要素は、返されることがあり、反復プロセスをデータセットから削除されているかどうかもよく、これは未定義未知です。
    3)単一の結果を返す、トラバースの端部を意味するものではない空であるが、カーソル返される値に依存はゼロであります
 

3、スキャンの使用

Redisの-CLIスキャン  [カーソル]  マッチ  [パターン]  カウント  [リミット]
1、三つのパラメータ:
  1. ユーザカーソル整数カーソルが0に設定され、それは新たな反復の開始を示します
  2. 正規表現パターン
  3. カウント制限 
    1. デフォルト10 
    2. 制限が返される結果の数を限定するものではないが、スロットの限られた数のサーバを介して単一のパスを辞書ことに留意されたいです)
    3. 必ずしもすべての反復が同じCOUNT値を使用する必要があります注意してください。ユーザーが自由にちょうど最後の繰り返しのカーソルが内部で使用される次の反復を返さ覚えて、各反復でCOUNT値を変更し、そのニーズに応じてすることができます
    4. 間違ったカーソルを使用しました。使用すると、インクリメンタル反復を実行するとクラッシュするサーバーが発生することはありませんが、それはコマンドが未定義の動作を生成させることの範囲または他の非正常なカーソルのうち、負、(壊れた)中断しました。
    5. 2つだけカーソルの有効な値:
      1. 新しい反復の開始時に、カーソルが0でなければなりません。
      2. 反復コマンドの繰り返しは、使用する前に、カーソルの値を返します。
2、戻り値:
  1. カーソルの次の反復
  2. この繰り返しの結果セット(空であってもよいです)
3、スキャンプロセス:
    カーソル値、スルー初めて返された結果が次のトラバーサルカーソルの最初の整数値に従う、0です。Redisのは、カーソルが夜12時00分に終了されて返すようにトラバースされて。
    カーソルとして0が常にカーソル0を返すように命令されるまでSCANコマンドを呼び出し、新しい反復を開始、我々は、このプロセスの完全なトラバーサル呼び出します。
 

4、スキャン指示インスタンス:

$ redis-cli scan 0 match key99* count 1000
1) "13912"
2)  1) "key997"
    2) "key9906"
    3) "key9957"
    4) "key9902"
    5) "key9971"
    6) "key9935"
    7) "key9958"
    8) "key9928"
    9) "key9931"
   10) "key9961"
   11) "key9948"
   12) "key9965"
   13) "key9937"
   
$ redis-cli scan 13912 match key99* count 1000
1) "5292"
2)  1) "key996"
    2) "key9960"
    3) "key9973"
    4) "key9978"
    5) "key9927"
    6) "key995"
    7) "key9992"
    
   从上面的过程可以看到虽然设置的limit是1000,但是返回的结果只有 10 个左右。这是因为因为这个 limit 不是限定返回结果的数量,而是限定服务器单次遍历的字典槽位数量(约等于)。所以如果将limit 设置为 10,你会发现返回结果是空的,但是游标值不为零,意味着遍历还没结束。

如果将limit设置为10,例如下:
$ redis-cli scan 0 match key99* count 10
1) "15360"
2) (empty list or set)

$ redis-cli scan 15360 match key99* count 10
1) "2304"
2) (empty list or set)

4、より多くのスキャン指示

スキャン指示は、すべてのキーを通過するだけでなく、一連の命令ですが、また、指定されたコンテナを横断するように設定することができます。"

  • 現在のデータベース内のデータベースキーの繰り返しのためのSCANコマンド、
  • zscan ZSETトラバース要素のコレクション、
  • HSCANトラバーサルキーハッシュ辞書右、
  • コレクションを設定する要素をトラバースSSCAN。

    注、SSCANコマンド、HSCANコマンドと最初のパラメータZSCANコマンドは常に鍵データベースです。SCANコマンドとは、最初の引数に任意のデータベースのキーを提供する必要はありません - それは現在のデータベース内のデータベース・キーのすべての反復であるため。

5、途中でストップ反復が可能

    すべての状態の反復がどのような状態の保存反復せずに、サーバー内のカーソルに格納されるため、そのクライアントは、予告なしに、反復の途中でサーバーを停止することができます。任意の回数の反復が途中で停止した場合であっても、それは何の問題も発生しません。

図6に示すように、反復の終わり

    カーソルがユーザに0 Redisのサーバ復帰である場合、これは反復の終了を決定する唯一の方法であり、反復が完了したことを示すが、結果セットが空の反復を終了するか否かが判断される返すことができません。

    ときに、データ・セット・サイズ有界(有界)一方コマンドを使用インクリメンタル反復アルゴリズムのみが保証され、データセットのサイズを拡張するために継続された場合、反復は反復、その後、他の言葉で、停止します、インクリメンタル反復コマンドは、完全な反復を完了することができないことがあります。

7、時間の複雑さ

    複雑性O(1)の各実行は、反復複雑さの完全なデータセットは、Nはデータセット内の要素の数であり、O(N)です。

 

8.参照文献

http://jinguoxing.github.io/redis/2018/09/04/redis-scan/

http://doc.redisfans.com/key/scan.html

 

公開された48元の記事 ウォン称賛35 ビュー80000 +

おすすめ

転載: blog.csdn.net/kqZhu/article/details/104408644