次のコラム Redis チュートリアル では、Redis での Scan コマンドの使用方法について詳しく説明します。困っている友人の役に立てば幸いです。
Redis には古典的な問題があります . 膨大な量のデータの場合、それは検索に似ていますルールのキーに関する情報を提供するには 2 つの方法があります。
1 つ目は、keys コマンドですが、これは単純で粗雑です。Redis のシングルスレッド機能により、keys コマンドはブロック方式であり、キーはトラバーサル方式で実装されます。複雑さは O(n) です。Redis ライブラリ内のキーが増えるほど、検索の実装コストが増加し、ブロック時間が長くなります。
2 番目は scan コマンドで、非ブロッキングな方法でキー値の検索を実装します。ほとんどの場合、keys コマンドを置き換えることができ、よりオプションです。
以下に 100,000 個のキーを記述します** * : value*** 形式のテスト データ (追記: パイプラインを使用する場合、1w が 1 つのトランザクションであり、各トランザクションは数秒で完了します)
# -*- coding: utf-8 -*- # !/usr/bin/env python3 import redis import sys import datetimedef create_testdata(): r = redis.StrictRedis(host='***.***.***.***', port=***, db=0, password='***') counter = 0 with r.pipeline(transaction=False) as p: for i in range(0, 100000): p.set('key' + str(i), "value" + str(i)) counter = counter + 1 if (counter == 10000): p.execute() counter = 0 print("set by pipline loop") if __name__ == "__main__": create_testdata()
たとえば、key111 で始まるキーは次のとおりですか?
keys コマンドを使用する場合は、keys key1111* を実行して一度に調べます。
同様に、scan コマンドを使用する場合は、scan 0 match key1111* count 20
の構文を使用します。 scan は :SCAN カーソル [MATCH パターン] [COUNT カウント] デフォルトの COUNT 値は 10 です。
SCAN コマンドはカーソルベースの反復子です。これは、コマンドが呼び出されるたびに、前の反復プロセスを継続するために、前の呼び出しによって返されたカーソルを呼び出しのカーソル パラメーターとして使用する必要があることを意味します。
scan 0 match key1111* count 20 コマンドは、このクエリを完了するためにここで使用されています。驚くべきことに、最初は結果が見つかりませんでした。これは scan コマンドの原理によって異なります。
スキャンがキーをスキャンする場合、0 は初回を表し、key1111* は key1111 で始まるパターンに従った一致を表します。カウント 20 の 20 は修飾されたキーの出力を表しませんが、サーバーを制限する辞書を表します。シングルトラバーサル スロットの数 (ほぼ等しい)。
それでは、スロットデータとは何でしょうか?このスロットは Redis クラスター内のスロットですか?答えは否定的です。実は、答えは上の図にすでに示されています。
上記の「辞書スロット」の数がクラスター内のスロットであり、クラスター内のスロットの数が 16384 であることがわかっている場合、16384 のスロットを走査した後、すべてのキーを確実に走査できるようになります。
上記から明らかなように、走査された辞書スロットの数が 20,000 の場合、カーソルはまだ走査結果を完了していないため、この辞書スロットはスロットの概念と等しくないことが明確にわかります。クラスター。
テスト後、スキャンするときに、条件を満たすキーに完全に一致するまでにいくつの COUNT 値をたどることができるかは、特定のオブジェクトのキーの数に関係します。
カウントがキーの数を超えた場合たとえば、キーの数が 100,000 で、200,000 の辞書スロットを一度に走査すると、結果は確実に完全に走査されます。
スキャン命令は一連の命令であり、すべてのキーを走査するだけでなく、指定されたコンテナ コレクションも走査できます。
zscan は zset コレクションの要素を走査し、
hscan はハッシュ ディクショナリの要素を走査し、
sscan は set コレクションの要素を走査します。
SSCAN コマンド、HSCAN コマンド、および ZSCAN コマンドの最初のパラメーターは常にデータベース キー (指定されたキー) です。
さらに、redis デスクトップ マネージャーを使用している場合、特定のライブラリを更新すると、コンソールは自動的にスキャン コマンドを継続的に更新するため、何をしているのかがわかります
#
以上がRedisのScanコマンドの使い方の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。