すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):ブルーム

最終更新日:Sep 12, 2024

ブルームは、大量のデータの中に要素が存在するかどうかをチェックするために最小限のメモリを消費する、空間効率の高い確率的データ構造です。 TairBloomは、スケーラブルブルームフィルタ (SBF) の実装である。 スケーリング中に安定した誤検出率を維持しながら、動的スケーラビリティを備えています。

概要

ハッシュ、セット、文字列などのRedisデータ構造でビットマップを使用して、TairBloomと同様の機能を実装できます。 しかしながら、これらのデータ構造は、大量のメモリを消費するか、または動的スケーリング中に安定した偽陽性率を維持できないことがある。 このため、TairBloomは、特定の偽陽性率が許可されている場合に大量のデータをチェックするのに理想的です。 さらにカプセル化したり、オンプレミスのデバイスで追加のBloomフィルターを作成する必要なく、TairBloomの組み込みのBloomフィルターを使用できます。

特徴

  • メモリの最小消費量。

  • 動的スケーリング。

  • スケーリング中の安定したカスタム偽陽性率。

典型的なシナリオ

TairBloomは、ライブストリーミング、音楽、eコマースなどの業界で推奨およびクローラシステムに使用できます。

  • レコメンデーションシステム: TairBloomは、推奨された可能性のある記事のIDを記録し、これらの記事を照会し、重複記事を決定し、ユーザーが興味を持つ可能性のある新しい記事を推奨します。

  • クローラーシステム: TairBloomは、生産性を向上させるためにクロールされたURLを除外します。

ベストプラクティス

TairBloomに基づく推奨システムの構築

TairBloomは、推薦された可能性のある記事のIDを記録し、これらの記事を照会し、重複記事を決定し、ユーザーが興味を持つ可能性のある新しい記事を推薦します。 疑似コード:

void recommendedSystem(userid) {
    while (true) {
        // Obtain a random article ID or a desired article ID. 
        docid = getDocByRandom()
        if (bf.exists(userid, docid)) {
            // If the article may have been recommended to a user, the next article is recommended. 
            continue;
        } else {
            // If the article has not been recommended to the user, the article is recommended. 
            sendRecommendMsg(docid);
            // If the article has been recommended, the article ID is recorded in a Bloom filter. 
            bf.add(userid, docid);
            break;
        }
    }
}

TairBloomに基づいてクローラーシステムを最適化する

TairBloomは、生産性を向上させるためにクロールされた可能性のあるURLを除外します。 疑似コード:

bool crawlerSystem( ) {
    一方、(TRUE){
        // クロールするURLを取得します。 
        url = getURLFromQueue()
        if (bf.exists(url_bloom, url)) {
            // URLがクロールされている可能性がある場合、URLはスキップされます。 
            continue;
        } else {
            // このURLをクロールします。 
            doDownload(url)
            // このURLをブルームフィルタに追加します。 
            bf.add(url_bloom, url);
        }
    }
}

制御ポリシー機能の動作

TairBloomはSBFの実装です。 安定した誤検出率を維持しながら、動的スケーラビリティを備えています。 SBFは、最適化されたブルームフィルタである。 次のセクションでは、ブルームフィルタとSBFの基本原理について説明します。

  • ブルームフィルター

    ブルームフィルタは、1970年にBurton Howard Bloomによって考案された空間効率の高い確率的データ構造であり、要素がセットのメンバーであるかどうかをテストするために使用されます。

    新しいブルームフィルタは、mビットのビット配列であり、そのすべてが0に設定される。 ブルームフィルタはまた、一様なランダム分布を生成するためにk個の異なるハッシュ関数のセットを含む。 kは、mより小さい定数である。 Bloomフィルターに要素を追加すると、k個のハッシュ関数はこれらの要素をビット配列のkビットにマップし、kビットを1の値に設定します。 この場合、1ビットを複数のデータで共有することができる。 次の図は、3つのハッシュ関数を含むBloomフィルターにX1とX2を挿入する方法を示しています。布隆过滤器插入x1、x2的过程

    ブルームフィルタで要素をクエリするときに、k個のハッシュ関数を使用してkビットを取得できます。 kビットの全てが1の値を有する場合、要素はブルームフィルタに存在する。 それ以外の場合、要素は存在しません。 次の図は、ブルームフィルターでY1とY2をクエリする方法を示しています。查询y1y2

    前の図は、Y2がブルームフィルタに挿入されなかったが、Y2がブルームフィルタに存在すると判定されることを示している。 このシナリオは、ブルームフィルタが偽陽性率を有することを示す。 上記の分析では、Bloomフィルターには次の機能があります。

    • ビットは、複数のデータによって共有することができる。

    • ブルームフィルタは偽陽性率を有し、この率は、ブルームフィルタ内の要素の数が増加するにつれて高くなる。 ただし、ブルームフィルターには偽陰性率はありません。 ブルームフィルタに要素が存在する場合、その要素は常に存在すると判定される。

    • 要素はブルームフィルタに追加できますが、ブルームフィルタから削除することはできません。 その理由は、ビットを共有できるからである。 ブルームフィルターから要素を削除すると、ブルームフィルター内の他の要素が影響を受けます。

  • SBF

    要素の数が増加すると、偽陽性率も増加する。 安定した偽陽性率を維持したい場合は、それに応じてブルームフィルタのサイズを大きくする必要があります。 しかし、構造上の制限によりサイズを大きくすることはできない。 この問題に対応してSBFが登場しました。 SBFは、複数のブルームフィルタを1つにまとめた新しいタイプのブルームフィルタです。

    SBFの基本モデルを次の図に示します。 このSBFは、BF0およびBF1の2つの層を有する。 まず、SBFはBF0層のみを含む。 要素a、b、およびcをこのSBFに挿入し、BF0レイヤーが指定された偽陽性率を維持するのに十分な大きさでない場合、BF1レイヤーはSBFサイズを大きくするように作成されます。 次に、要素d、e、fをBF1層に挿入する。 BF1レイヤーも指定された正のレートを維持できない場合、BF2という名前の新しいレイヤーが作成されます。SBF模型

    SBFは、最後の層にのみデータを挿入し、最後の層からBF0層にデータを照会する。 詳細については、「スケーラブルなブルームフィルター」をご参照ください。

前提条件

Tair DRAMベースのインスタンスが作成されます。

説明

最新のマイナーバージョンは、より多くの機能とより高い安定性を提供します。 インスタンスを最新のマイナーバージョンに更新することを推奨します。 詳細については、「インスタンスのマイナーバージョンの更新」をご参照ください。 インスタンスがクラスターまたは読み書き分離インスタンスの場合、インスタンスのプロキシノードを最新のマイナーバージョンに更新することを推奨します。 これにより、すべてのコマンドを期待どおりに実行できます。

注意事項

  • 管理するTairBloomデータは、Tairインスタンスに保存されます。

  • 要件を満たす初期容量と誤検出率は、事前に計算する必要があります。 100要素をはるかに超える容量を持つTairBloomキーを作成するには、BF.ADDコマンドの代わりにBF.RESERVEコマンドを実行します。

    次のセクションでは、BF.ADDコマンドとBF.RESERVEコマンドの違いを示します。

    • BF.ADD (BF.MADDとも呼ばれます): このコマンドの実行時にTairBloomキーが存在しない場合、キーは自動的に作成されます。 鍵のデフォルト容量は100であり、鍵のデフォルト誤検出率は0.01である。 100をはるかに超えるキー容量が必要な場合は、キーをスケールアップするだけで、より多くの要素をサポートできます。

      キーをスケールアップすると、ブルームフィルターのレイヤーが追加されます。 ブルームフィルタ層が追加されるたびに、鍵容量は増加する。 この場合、キーに対してクエリを実行すると、複数のレイヤーのブルームフィルターをトラバースする必要があり、キーのパフォーマンスが大幅に低下します。

    • BF.RESERVE (BF.INSERTとも呼ばれます): このコマンドの実行時に初期容量が指定されます。 このコマンドは、鍵の第1層における初期容量を指定する。 キーに含まれるブルームフィルターレイヤーの数が少ない場合、キーのクエリ速度は速くなります。

    説明

    たとえば、10,000,000の要素をキーに挿入し、誤検出率の0.01を許可するとします。 作成されるキーは、BF.ADDコマンドを使用する場合は176 MB、BF.RESERVEコマンドを使用する場合は16 MBです。

    キーはスケールアップできますが、安全対策としてのみキーのスケールアップを検討し、キーを頻繁にスケールアップしないことをお勧めします。 キーの実際の容量がプロビジョニングされたキーの容量を超える場合は、キーをスケールアップして、キーに対して書き込み操作を実行できるようにし、ライブ事故を防ぐことができます。

    次の表は、BF.RESERVEコマンドによってサポートされるさまざまなキーサイズと、それらの一致した初期容量と偽陽性率を示しています。

    容量 (要素数)

    偽陽性: 0.01

    偽陽性: 0.001

    false positive:0.0001

    100,000

    0.12 MB

    0.25 MB

    0.25 MB

    1,000,000

    2 MB

    2 MB

    4 MB

    10,000,000

    16 MB

    32 MB

    32 MB

    100,000,000

    128 MB

    256 MB

    256 MB

    1,000,000,000

    2 GB

    2 GB

    4 GB

  • 要素はキーに追加でき、キーから削除できないため、キーのサイズを小さくすることはできません。 メモリ不足 (OOM) エラーなどの容量の問題を防ぐために、次のソリューションを実装することを推奨します。

    • ビジネスデータを分割します。 ビジネスデータを分割して、クエリのパフォーマンスに影響を与える大きなキーを防ぐことができます。 大きなキーが存在する場合、ほとんどのリクエストはこれらのキーを含むインスタンスに対して行われます。 これにより、ホットキーやスキューリクエストが発生する可能性があります。

      分割したデータを複数のキーに配布できます。 ビジネスデータがTairクラスターインスタンスに保存されている場合、分割データをインスタンス内の複数のノードに配布して、大きなキーとホットキーが発生しないようにすることができます。

    • 定期的にキーを再構築します。 可能であれば、DELコマンドを実行してキーからデータを削除し、バックエンドデータベースのデータをキーに挿入してキーのサイズを管理できます。

      複数のキーを作成して同じ意味で使用することもできます。 このようにして、単一のキーのサイズが適切に保たれる。 このソリューションの利点は、キーを1回だけ作成する必要があることです。 ただし、複数のキーを作成する必要があり、メモリが無駄になる場合があります。

サポートされるコマンド

表 1. TairBloomコマンド

コマンド

構文

説明

BF. 予約

BF.RESERVEキーerror_rate capacity

指定された容量と偽陽性率を持つ空のTairBloomキーを作成します。 capacityパラメーターはキーの容量を指定し、error_rateパラメーターはキーの偽陽性率を指定します。

BF.ADD

BF.ADDキーアイテム

TairBloomキーに要素を追加します。

BF. マッド

BF.MADDキーアイテム [item ...]

TairBloomキーに複数の要素を追加します。

BF.EXISTS

BF.EXISTSキーアイテム

TairBloomキーに要素が存在するかどうかをチェックします。

BF. メキシコ人

BF.MEXISTSキーアイテム [item ...]

TairBloomキーに複数の要素が存在するかどうかを確認します。

BF. インサート

BF.INSERTキー [容量キャップ] [エラーエラー] [NOCREATE] ITEMS item [item ...]

TairBloomキーに複数の要素を追加します。 キーが存在しない場合は、キーを作成するかどうかを指定できます。 キーの容量と誤検出率を指定することもできます。

BF.INFO

BF.INFOキー

TairBloomキーに関する情報を取得します。 情報は、層の数、各層におけるアイテムの数、および偽陽性率を含む。

DEL

DELキー [キー...]

1つ以上のTairBloomキーを削除します。

説明

キーに既に追加されている要素は削除できません。 DELコマンドを実行して、キーからすべてのデータを削除できます。

説明

このトピックで使用されるコマンド構文の規則を次に示します。

  • Uppercase keyword: commandキーワードを示します。

  • イタリックテキスト: 変数を示します。

  • [options]: 囲まれたパラメータがオプションであることを示します。 括弧で囲まれていないパラメータを指定する必要があります。

  • A | B: 縦棒 (|) で区切られたパラメータが相互に排他的であることを示します。 指定できるパラメーターは1つだけです。

  • ...: このシンボルの前にあるパラメーターを繰り返し指定できることを示します。

BF. 予約

項目

説明

構文

BF.RESERVEキーerror_rate capacity

時間の複雑さ

O(1)

コマンド説明

指定された容量と偽陽性率を持つ空のTairBloomキーを作成します。 capacityパラメーターはキーの容量を指定し、error_rateパラメーターはキーの偽陽性率を指定します。

パラメーター

  • キー: このコマンドを実行して管理するキーの名前。

  • error_rate: 予想される誤検出率。 このパラメーターの値は0〜1でなければなりません。 値が低いほど、キーの精度、メモリ使用量、およびCPU使用率が高いことを示します。

  • capacity: キーの初期容量。 このパラメーターは、キーに追加できる要素の最大数を指定します。

    キーに追加された要素の数が容量値を超えると、Bloomフィルターレイヤーがキーに追加されます。 このプロセスは、キーのクエリ性能を低下させ得る。 ブルームフィルタ層が追加されるたびに、鍵容量は増加する。 この場合、キーに対してクエリを実行する場合、複数のレイヤーのブルームフィルターをトラバースする必要があります。 ワークロードに高いパフォーマンスが必要な場合は、ビジネス要件に基づいて要素をキーに追加して、自動スケーリングを防ぐことをお勧めします。

Output

  • 操作が成功した場合、OKが返されます。

  • それ以外の場合、エラーメッセージが返されます。

例:

サンプルコマンド:

BF.RESERVE BFKEY 0.01 100

サンプル出力:

OK

BF.ADD

項目

説明

構文

BF.ADDキーアイテム

時間の複雑さ

ここで、Nはブルームフィルタ層の数を指定する。

コマンド説明

TairBloomキーに要素を追加します。

説明

キーが存在しない場合、キーは自動的に作成されます。 鍵のデフォルト容量は100であり、鍵のデフォルト誤検出率は0.01である。

パラメーター

  • キー: このコマンドを実行して管理するキーの名前。

  • item: キーに追加する要素。

Output

  • 要素が存在しない場合は、要素が追加され、値1が返されます。

  • 要素がすでに存在する可能性がある場合、要素は追加または更新されず、値0が返されます。

  • それ以外の場合、エラーメッセージが返されます。

例:

サンプルコマンド:

BF.ADD BFKEY item1

サンプル出力:

(integer) 1

BF. マッド

項目

説明

構文

BF.MADDキーアイテム [item ...]

時間の複雑さ

ここで、Nはブルームフィルタ層の数を指定する。

コマンド説明

TairBloomキーに複数の要素を追加します。

説明

キーが存在しない場合、キーは自動的に作成されます。 鍵のデフォルト容量は100であり、鍵のデフォルト誤検出率は0.01である。

パラメーター

  • キー: このコマンドを実行して管理するキーの名前。

  • item: キーに追加する要素。 複数の要素を指定できます。

Output

  • 要素が存在しない場合は、要素が追加され、値1が返されます。

  • 要素がすでに存在する可能性がある場合、要素は追加または更新されず、値0が返されます。

  • それ以外の場合、エラーメッセージが返されます。

例:

サンプルコマンド:

BF.MADD BFKEY itm1 item2 item3

サンプル出力:

(integer) 1
(integer) 1
(integer) 1

BF. 出口

項目

説明

構文

BF.EXISTSキーアイテム

時間の複雑さ

ここで、Nはブルームフィルタ層の数を指定する。

コマンド説明

TairBloomキーに要素が存在するかどうかをチェックします。

パラメーター

  • キー: このコマンドを実行して管理するキーの名前。

  • item: クエリする要素。

Output

  • 要素が存在しない場合、0の値が返されます。

  • 要素が存在する可能性がある場合、値1が返されます。

  • それ以外の場合、エラーメッセージが返されます。

例:

サンプルコマンド:

BF.EXISTS BFKEY item1

サンプル出力:

(integer) 1

BF. メキシコ人

項目

説明

構文

BF.MEXISTSキーアイテム [item ...]

時間の複雑さ

ここで、Nはブルームフィルタ層の数を指定する。

コマンド説明

TairBloomキーに複数の要素が存在するかどうかを確認します。

パラメーター

  • キー: このコマンドを実行して管理するキーの名前。

  • item: クエリする要素。 複数の要素を指定できます。

Output

  • 要素が存在しない場合、0の値が返されます。

  • 要素が存在する可能性がある場合、値1が返されます。

  • それ以外の場合、エラーメッセージが返されます。

例:

サンプルコマンド:

BF.MEXISTS BFKEY item1 item5

サンプル出力:

(integer) 1
(integer) 0

BF. インサート

項目

説明

構文

BF.INSERTキー [容量キャップ] [エラーエラー] [NOCREATE] ITEMS item [item ...]

時間の複雑さ

ここで、Nはブルームフィルタ層の数を指定する。

コマンド説明

TairBloomキーに複数の要素を追加します。 キーが存在しない場合は、キーを作成するかどうかを指定できます。 キーの容量と誤検出率を指定することもできます。

パラメーター

  • キー: このコマンドを実行して管理するキーの名前。

  • capacity: キーの初期容量。 このパラメーターは、キーに追加できる要素の最大数を指定します。 キーが存在する場合、このパラメーターは無視されます。

    キーに追加された要素の数が容量値を超えると、別のBloomフィルターレイヤーが自動的にキーに追加されます。 スケーリング中に、キー内の要素の数が増加し、パフォーマンスが低下します。 レイヤがキーに追加された後に特定の要素を照会するために、複数のレイヤをトラバースすることができる。 各新しい層の容量は、前の層の容量の2倍である。 ワークロードに高いパフォーマンスが必要な場合は、ビジネス要件に基づいて要素をキーに追加して、自動スケーリングを防ぐことをお勧めします。

  • error_rate: 予想される誤検出率。 このパラメーターの値は0〜1でなければなりません。 値が低いほど、キーの精度、メモリ使用量、およびCPU使用率が高いことを示します。

  • NOCREATE: キーが存在しない場合、キーが自動的に作成されないように指定します。 このパラメーターは、capacityまたはerror_rateパラメーターと一緒に指定することはできません。

  • item: 追加する要素。 複数の要素を指定できます。

Output

  • 要素が存在しない場合は、要素が追加され、値1が返されます。

  • 要素がすでに存在する可能性がある場合、要素は追加または更新されず、値0が返されます。

  • それ以外の場合、エラーメッセージが返されます。

例:

サンプルコマンド:

BF.INSERT bfkey1 CAPACITY 10000 ERROR 0.001 ITEMS item1 item2 item3

サンプル出力:

(integer) 1
(integer) 1
(integer) 1

BF.INFO

項目

説明

構文

BF.INFOキー

時間の複雑さ

ここで、Nはブルームフィルタ層の数を指定する。

コマンド説明

TairBloomキーに関する情報を取得します。 情報は、層の数、各層におけるアイテムの数、および偽陽性率を含む。

パラメーター

  • キー: このコマンドを実行して管理するキーの名前。

Output

  • 操作が成功した場合、TairBloomキーに関する情報が返されます。

  • それ以外の場合、エラーメッセージが返されます。

例:

サンプルコマンド:

BF.INFO bk1

サンプル出力:

1) "total_items:6,num_blooms:2"
2) "bytes:4 bits:32 hashes:7 hashwidth:64 capacity:3 items:3 error_ratio:0.01"
3) "bytes:16 bits:128 hashes:9 hashwidth:64 capacity:10 items:3 error_ratio:0.0025"

BF.INFO応答パラメータ:

  • total_itemsは要素の総数を示し、num_blomesはブルームフィルタレイヤーの総数を示します。

  • 各ブルームフィルター層の情報:

    • bytes: 占有バイト数。

    • bits: 占有ビット数。バイト数に8を掛けた値として計算されます。

    • hashes: ハッシュ関数の数。

    • hashwidth: ハッシュ関数の幅。

    • 容量: 容量。

    • items: 要素の数。

    • error_ratio: 偽陽性率。