Redisデータベースシリーズの2

5938 ワード

ScanはRedis 2です.8リリース後、keysコマンドの問題を効果的に解決する新しいコマンドが提供されました.keysコマンドの実行時にすべてのキーが遍歴するのとは異なり、scanは漸進的な遍歴方式を採用してkeysコマンドがもたらすブロック問題を解決し、scanコマンドの時間の複雑さはO(1)であるが、keysの機能を実現するには、複数回のscanを実行する必要がある.
目次
scan
scan
1.文法scan cursor[match pattern][count count]2.解析scanコマンドおよびそれに関連するsscanコマンド、hscanコマンドおよびzscanコマンドは、インクリメンタル反復-セット要素に使用する:scan:コマンドは、現在のデータベース内のデータベースキーを反復するために使用される.sscan:コマンドは、コレクションキーの要素を反復するために使用されます.hscan:コマンドは、ハッシュキーのキー値ペアを反復するために使用されます.zscan:コマンドは、順序付けされたセット内の要素を反復するために使用されます.(要素メンバーと要素スコアを含む)以上の4つのコマンドはインクリメンタル反復をサポートし、実行するたびに少量の要素しか返さないため、keysコマンド、smemberコマンドのような問題は発生せず、keysコマンドが大きなデータベースの処理に使用される場合、またはsmembersコマンドが大きなコレクションキーの処理に使用される場合、サーバが数秒もブロックされる可能性があります.ただし、インクリメンタル反復コマンドにも欠点はありません.たとえば、smembersコマンドを使用すると、セットキーに現在含まれているすべての要素を返すことができますが、scanのようなインクリメンタル反復コマンドでは、キーがインクリメンタル反復中にキーが変更される可能性があるため、インクリメンタル反復コマンドは、返される要素に限られた保証しか提供できません.scan、sscan、hscan、zscanの4つのコマンドの動作は非常に似ているため、sscanコマンド、hscanコマンド、zscanコマンドの最初のパラメータは常にデータベース・キーであり、scanコマンドは現在のデータベース内のすべてのデータベース・キーを反復するため、最初のパラメータにデータ・キーを提供する必要はありません.3.scanコマンドの基本的な使い方scanコマンドは、カーソルベースの反復器です.scanは呼び出されるたびに、ユーザーに新しいカーソルを返します.ユーザーは、次回の反復時にscanコマンドのカーソルパラメータとしてこの新しいカーソルを使用して、前の反復プロセスを継続する必要があります.scanコマンドのカーソルパラメータが0に設定されると、サーバは新しい反復を開始し、サーバがユーザに0のカーソルを返すと反復が終了することを示します.3.1)例:
mset a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12
scan 0
scan 7

3.2)解析:上記の例では、最初の反復は0をカーソルとして使用し、新しい反復を開始することを示す.2回目の反復は、1回目の反復時に戻るカーソル、すなわち、コマンドが1番目の要素の値を返信する7を使用する.上記の例から、scanコマンドの返信は2つの要素を含む配列であり、最初の要素は次の反復を行うためのカーソルであり、2番目の要素は反復されたすべての要素を含む配列であることがわかります.scanコマンドが2回目に呼び出されると、コマンドはカーソル0を返します.これは、反復が終了し、データセット全体が完全に遍歴されたことを示します.0をカーソルとして新しい反復を開始し、scanコマンドを呼び出し、コマンドがカーソル0に戻るまで、このプロセスを完全な遍歴.4と呼ぶ.scanコマンドの保証scanコマンド、およびその他のインクリメンタル反復コマンドは、完全な遍歴を行う場合に、完全な遍歴から完全な遍歴が終了するまで、データセット内に存在するすべての要素が完全な遍歴で返されることをユーザーに保証することができます.これは、ループの開始からループの終了までの間にループされたデータセットが存在する要素がある場合、scanコマンドは常にある反復でこの要素をユーザーに返すことを意味します.しかしながら、インクリメンタルコマンドはカーソルのみを用いる反復状態を記録するため、同じ要素が複数回返される可能性があり、重複要素を処理する作業はアプリケーションに任せるという欠点がある.例えば、反復して返される要素は、安全に複数回繰り返し実行できる操作にのみ使用されることが考えられる.1つの要素が反復中にデータセットに追加された場合、または反復中にデータセットから削除された場合、この要素は返されるか、定義されていない可能性があります.5.scanコマンドが実行されるたびに返される要素数インクリメンタル反復コマンドは、実行されるたびに所定の数の要素を返すことを保証しません.インクリメンタルコマンド設定は、ゼロ要素を返す可能性がありますが、コマンドが返すカーソルが0でない限り、アプリケーションは反復を終了と見なすべきではありません.しかし、コマンドが返す要素の数は常に一定の規則に合致しています.実際には、大きなデータセットでは、インクリメンタル反復コマンドは毎回数十の要素を返す可能性があります.十分に小さなデータセットの場合、このデータセットの最下位が符号化データ構造(小さな集合キー、小さなハッシュキー、および小さな秩序化された集合キーに適用される)として表される場合、インクリメンタル反復コマンドは、1回の呼び出しでデータセットのすべての要素を返します.最後に、ユーザーはインクリメンタル反復コマンドでcountオプションを提供して、反復ごとに要素を返す最大値を指定できます.6.countオプションインクリメンタル反復コマンドでは、反復ごとに返される要素の数は保証されませんが、countオプションを使用して、コマンドをある程度調整できます.countオプションはインクリメンタル反復コマンドに対するプロンプトにすぎませんが、ほとんどの場合、このプロンプトは有効です.countのデフォルト値は10です.ハッシュ・テーブルで実装されるデータベース、コレクション・キー、ハッシュ・キー、または秩序化されたコレクション・キーを反復する場合、ユーザーがmatchオプションを使用していない場合、コマンドが返す要素の数は通常countオプションで指定されたものと同じか、countオプションで指定された数より少し多い.整数セットとして符号化されたり、圧縮リストとして符号化されたりする場合、インクリメンタル反復コマンドはcountオプションで指定された値を無視し、最初の反復でデータセットに含まれるすべての要素をユーザーに返します.注意:反復のたびに同じcount値が使用されるわけではありません.ユーザーは、前回の反復で返されたカーソルが次回の反復に使用されることを覚えていれば、反復のたびに自分の必要に応じてcount値を任意に変更できます.7.matchオプション:keysコマンドと同様に、インクリメンタル反復コマンドはglobスタイルのモードパラメータを提供することによって、コマンドが所定のモードと一致する要素だけを返すこともできます.これは、インクリメンタル反復コマンドを実行するときに、matchパラメータを指定することによって実現できます.7.1)例:
sadd myset  1 2 3 foo foobar feelsgood
sscan myset 0 match f*

なお、要素のモードマッチングは、コマンドがデータセットから要素を取り出した後、クライアントに要素を返すまでの時間で行われるので、反復されたデータセットに少量の要素とモードが一致している場合、反復コマンドは複数回実行しても要素を返さない可能性があります.7.2)例:
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"

これらの反復の大部分は要素を返さない.最後の反復ではcountオプションのパラメータを1000に設定し、コマンドに今回の反復のためにより多くの要素をスキャンさせ、コマンドが返す要素も多くなりました.8.複数の反復を同時に実行同じ時間に、同じデータセットに対して任意の複数のクライアントが反復することができ、クライアントは反復を実行するたびにカーソルを入力し、反復実行後に新しいカーソルを取得する必要があります.このカーソルには反復のある状態が含まれているため、サーバは反復のために任意の状態を記録する必要はありません.9.反復を途中で停止反復は、反復のすべてのステータスがカーソルに保存され、サーバが反復のステータスを保存する必要がないため、クライアントはサーバに通知することなく、反復を途中で停止することができます.10.誤ったカーソルを使用するインクリメンタル反復単純、負数、範囲外、またはその他の異常なカーソルを使用してインクリメンタル反復を実行してもサーバがクラッシュすることはないが、コマンドに未定義の動作を生じさせる可能性がある.未定義の動作とは、インクリメンタルコマンドによる戻り値の保証が真ではない可能性があることを意味します.10.1)2つのカーソルのみが正当:1.新しい反復では、カーソルは0でなければなりません.2.インクリメンタル反復コマンドは、実行時に返され、反復プロセスを継続するためのカーソルです.11.反復終了の保証インクリメンタル反復コマンドに使用されるアルゴリズムは、データセットのサイズに限界がある場合にのみ反復が停止することを保証し、言い換えれば、反復されるデータセットのサイズが絶えず増加すると、インクリメンタル反復コマンドは完全な反復を完了することができない可能性がある.直感的に見ると、1つのデータセットが絶えず大きくなると、このデータセットのすべての要素にアクセスするには、1つの反復を終了できるかどうかは、ユーザーが反復を実行する速度がデータセットよりも速くなるかどうかにかかっている.戻り値scanコマンド、sscanコマンド、hscanコマンド、zscanコマンドは、2つの要素を含むmulti-bulk返信を返します.返信の最初の要素は文字列で表される符号なし64ビット整数(カーソル)で、返信の2番目の要素は別のmulti-bulk返信です.このmulti-bulk返信には、今回反復された要素scanコマンドが返す各要素がデータベースキーであることが含まれています.sscanコマンドが返す各要素はセットです.hscanコマンドで返される各要素は、キー値ペアであり、キー値ペアはキーと値で構成されます.zscanコマンドで返される各要素は、メンバーとスコアからなる秩序化された集合要素です.13.例
#scan(    )
mset google "google.cn"   baidu  "baidu.com"
scan 0 match *g*
#hscan(      )
hset student name sunny age 30 sex 1
hscan student 0 match *ex*
#sscan(       )
sadd baidu "baidu.com"  "baidu.cn"
sscan baidu 0
#zscan(         )
zadd bbs 10 "bbs.com" 24 "bbs.cn" 9 "bbs.gov"
zscan bbs 0 match *gov*