Redis ZSCAN

Redis Zscan



並べ替えられたセットのメンバーを反復処理する

ご存知のように、Redis の並べ替えられたセットは、各メンバーがそのスコア値によって昇順で並べられる通常のセットから派生します。 2 つ以上のメンバーが同じスコア値を保持している場合、それらは辞書順で並べられます。通常、メンバーとスコアは、ZRANGE コマンドを使用して直接取得できます。数千のメンバーを持つ大きな並べ替えられたセットがある場合、ZRANGE コマンドは、SMEMBERS および KEYS コマンドのようにサーバーを長時間ブロックする可能性があり、これが欠点です。そのため、Redis は、SCAN コマンドから派生した ZSCAN と呼ばれる特別なコマンドを提供して、並べ替えられたセットのメンバーを反復処理します。 ZSCAN コマンドは SCAN コマンドを継承しているため、ほとんどすべての動作は汎用の SCAN コマンドと同じです。







与えられた図のように、SCAN コマンドはカーソルベースの反復子です。したがって、Redis コレクションのすべてのアイテムを提供するには、1 回以上の反復が必要です。 ZSCAN コマンドは親 SCAN コマンドを継承しているため、動作は同じです。このガイドでは、ZSCAN コマンドの構文と使用例について詳しく説明します。



ZSCAN コマンド

ZSCAN コマンドは、0 番目のカーソルから反復を開始するカーソルベースの反復子です。その後、各反復で、次のコマンド呼び出しのカーソルとして使用する必要がある次のカーソルとともに、0 個以上の並べ替えられたセット メンバーを返します。 1 回以上の反復後に返されたカーソルが 0 の場合、スキャン プロセスが終了したことを意味します。この時点で、すべてのソート済みセット メンバーが返されます。このプロセスは、完全反復と呼ばれます。ご覧のとおり、ZSCAN コマンドはカーソルのみを使用して状態を保持するため、状態認識が制限されます。したがって、ZSCAN コマンドには次の欠点があります。



  • 同じ要素が複数の反復で返される場合があります。
  • スキャン プロセスの開始時にメンバーが存在しない場合、完全な反復中にそのメンバーが返されない可能性があります。

また、返されたメンバーの数に保証はありません。場合によっては、並べ替えられたセットが非常に小さい場合、最初の繰り返しですべてのメンバーが返されることがあります。 Redis は特別なシングル アロケーション パック エンコーディング フォーマットを使用して、最大アイテム数に達するまでメンバーを保持するためです。 ZSCAN コマンドは、スキャンされたデータ構造がハッシュ テーブルとして表されている場合にのみ、カーソルを返すことができます。





構文:
ZSCAN コマンドは、ソートされたセット キーを最初の引数として受け入れることを除いて、SCAN コマンドとほぼ同じ構文を使用します。許可された引数を使用したコマンド構文は次のとおりです。

ZSCAN sorted_set_key カーソル [ マッチパターン ] [ COUNT member_count ]

sorted_set_key : ソート済みセットのキー。
カーソル : カーソル値は 0 から始まり、完全な反復の場合は 0 で終わります。



次の引数はオプションです。

マッチ : 各繰り返しで要素を取得するときに一致するパターン。一致したメンバーのみが返されます。
カウント : 各反復で返されるメンバーのおおよその数。

反復ごとに返される結果セットには、いくつかの要素が含まれています。最初の部分は、次の呼び出しに渡されるカーソルを表す 64 ビットの符号なし整数です。次の部分は、メンバーと関連するスコアの配列です。

ユース ケース 1 – オンライン ゲームのすべてのメンバーとその完了したミッションを取得する

オンライン ゲーム会社が Redis ソート セットを使用してリーダーボードを管理しているとします。大規模なユーザーが積極的にゲームをプレイしているため、各プレイヤーと、完了したミッションの数である関連スコアを取得する方法が必要です。サーバーをブロックせずに取得を実行する必要があります。したがって、次のように ZSCAN コマンドを使用することをお勧めします。

まず、何人かのプレイヤーと完了したミッションの数でソートされたセットを作成します。

zadd リーダーボード 12 Player6:ジョン 4 Player2:メアリー 22 Player1:パテル 15 プレーヤー: 十一 23 Player5:アン 30 Player7:ハーシュ 23 Player12:アビー 2 Player13:ニッキー 6 Player9:ジェレミー 7 Player45:キナ

これで、並べ替えられたセットのメンバーを次のように反復処理できます。

zscanリーダーボード 0

出力:

返される結果セットのカーソル値は 0 です。これは、すべてのメンバーが最初の繰り返しの最後に返されることを意味します。この場合、メンバーの数が少ないため、Redis は単一割り当てパック エンコーディングを使用してこれらのメンバーを表します。したがって、最大パック サイズまたはメンバー数に達するまで、コマンドは並べ替えられたセット内のすべてのメンバーを返します。これは完全反復と呼ばれます。最初の繰り返しの終わりに、10 人のメンバーすべてとそのスコアを受け取るためです。何百ものメンバーがある場合、それはメモリ内のハッシュ テーブルとして表されます。そのため、すべてのメンバーを返すには数回の反復が必要です。

COUNT パラメータを使用して、反復で返されるメンバーの数を制限できます。デフォルトでは、この引数は 10 に設定されています。ソートされたセットが数百のメンバーで構成されている場合、メモリ内のハッシュ テーブルによって表されます。したがって、返されるメンバーの数は反復ごとに約 10 です。ソートされたセットが小さすぎる場合、COUNT 引数の値は無視されます。

ユース ケース 2 – 名前が文字「J」で始まるプレーヤーを取得する

ZSCAN コマンドを使用して、返されたメンバーをパターン マッチに基づいて除外できます。その場合、MATCH 引数を指定する必要があります。

前の使用例と同じ例を使用してみましょう。要件は、名前が文字「J」で始まるプレーヤーを取得することです。ゲームに関連する次のクールな機能を実装するだけです。 MATCH 引数は次のように指定できます。

zscanリーダーボード 0 マッチ * J *

これにより、理想的には、Jeremy と John という名前の 2 つのメンバーが返されます。

結論

要約すると、ZSCAN コマンドは、Redis の並べ替えられたセットのメンバーとスコアを反復処理するために使用されます。このコマンドは、ZSCAN コマンドが最初の引数としてセット キーを受け入れることを除いて、SCAN コマンドと同じように動作します。ユース ケースで説明したように、MATCH および COUNT 引数を指定することにより、ZSCAN コマンドをさまざまな方法で使用できます。特定のパターンに一致するメンバーと関連するスコアを取得し、反復ごとに返されるメンバー数を制限できます。全体として、ZSCAN コマンドは、サーバーまたはクライアントをブロックすることなく、並べ替えられたセットのメンバーを取得するときに役立ちます。