ブルーム フィルタは、ある要素がある集合のメンバーであるかどうかを判断するために使用できる、スペース効率の高い確率的データ構造です。このような構造では、誤検出が発生する可能性があります。たとえば、要素がセット内にない場合でも、フィルタがセット内にあることを示すことがあります。ただし、偽陰性は許容されません。したがって、要素をセットに追加する場合は、フィルタでその要素がセットに含まれていることを示す必要があります。
このフィルタは、複数のハッシュ関数を使用して、固定サイズのビット配列内の複数のビットに要素をマッピングすることで、これを実現します。誤検出の確率を制御するには、配列内のビット数と使用するハッシュ関数の数を調整します。
ユースケース
このセクションでは、ブルーム フィルタを使用する次のユースケースについて説明します。
広告とイベントの重複排除: e コマース サイト、ストリーミング サービス、広告掲載ネットワーク、マーケティング プラットフォームがある場合、ブルーム フィルタを使用すると、ユーザーが広告を見たかどうか、プロモーション メールや通知を受け取ったかどうか、商品を購入したかどうかを判断できます。
ブルーム フィルタを使用して、ユーザーが購入したすべての商品を保存できます。
- 商品がフィルタに含まれていない場合は、ユーザーに広告を表示し、商品をフィルタに追加します。
- 商品がフィルタに含まれている場合、ユーザーは関連する広告を見て、その商品を購入した可能性があります。そのため、ユーザーに表示する別の広告を探します。
不正行為を検出する: Bloom フィルタを使用して、クレジット カードが盗難としてフラグ設定されているかどうかを検出できます。これを行うには、盗難として報告されたカードを含むフィルタを使用します。カードが使用されたら、フィルタに表示されるかどうかを確認します。
- カードがフィルタに含まれていない場合、盗難としてマークされません。
- カードがフィルタに含まれている場合は、メイン データベースと照合するか、購入を拒否できます。
スパムと有害なコンテンツをフィルタする: ブルーム フィルタを使用して、潜在的な脅威、有害な素材、スパムがないかコンテンツをスクリーニングできます。これを行うには、悪意のある URL、スパムメール アドレス、スパム電話番号を含むフィルタを作成します。ユーザーが URL を入力したとき、またはメールやテキストを受信したときに、この情報がフィルタに表示されるかどうかを確認します。
- URL、メール、テキストがフィルタに含まれていない場合は、ユーザーが URL で表されるサイトにアクセスしたり、メールやテキストを受信したりできるようにします。
- URL、メール、テキストがフィルタに含まれている場合は、関連付けられたサイトへのユーザーのアクセスを拒否するか、ユーザーがメールやテキストを受信できないようにします。
重複するユーザー名を検出する: ブルーム フィルタを使用して、ユーザー名が新しいか、すでに存在するかを判断できます。そのためには、フィルタを使用して、e コマース サイトやストリーミング サービスに登録したすべてのユーザー名をトラッキングします。新規ユーザーがユーザー名で登録しようとしたときに、そのユーザー名がフィルタに表示されるかどうかを確認します。
- ユーザー名がフィルタにない場合は、アカウントを作成して、ユーザー名をフィルタに追加します。
- ユーザー名がフィルタに含まれている場合は、ユーザー名を拒否します。
これらのユースケースの詳細については、ブルーム フィルタの一般的なユースケースをご覧ください。
対象
Memorystore for Valkey インスタンス(バージョン 8.0 以降)を作成すると、Bloom データ型と関連コマンドのバージョン 1.0 が自動的に使用可能になります。このデータ型は、次の Valkey クライアント ライブラリの Bloom フィルタ コマンド構文と API 互換性があります。
ブルーム フィルタの種類
次の種類の Bloom フィルタを使用できます。
- スケーリング: このタイプのフィルタには固定容量がないため、フィルタを拡張できます。フィルタが容量に達し、フィルタに新しい一意のアイテムを追加すると、フィルタがスケールアウトし、新しいサブフィルタが作成されます。このサブフィルタは、フィルタよりも容量が大きくなっています。
- 非スケーリング: このタイプのフィルタには固定容量があるため、フィルタに追加できるアイテムの数には上限があります。フィルタが容量に達した状態で、新しい一意のアイテムをフィルタに追加しようとすると、エラーが発生します。
これらのタイプの Bloom フィルタの違いについては、スケーリング可能な Bloom フィルタとスケーリング不可能な Bloom フィルタをご覧ください。
ブルーム フィルタのプロパティ
ブルーム フィルタには次のプロパティがあります。
- 容量: ブルーム フィルタがスケールアウトする(スケーリング フィルタの場合)か、追加のアイテムの追加を拒否する(非スケーリング フィルタの場合)前に、ブルーム フィルタが保持できるアイテムの数。
- 偽陽性率: Bloom フィルタのオペレーションで偽陽性が発生する確率を制御する率。たとえば、要素がフィルタに含まれているかどうかを確認するために使用するオペレーションは、要素がフィルタに含まれていない場合でも、含まれていることを示します。
- 拡張: このプロパティは、Bloom フィルタのスケーリングに関連付けられています。フィルタが容量に達したときにスケールアウトするため、全体的な容量の増加を制御します。
- スケーリングまたは非スケーリング: Bloom フィルタがスケーリング フィルタか非スケーリング フィルタか。
ブルーム フィルタのプロパティの詳細については、ブルーム プロパティをご覧ください。
ブルーム フィルタ オブジェクト
ブルーム フィルタ オブジェクトは、最大 128 MB のメモリを使用できます。ブルーム フィルタが消費するメモリの量を確認するには、BF.INFO key SIZE コマンドを使用します。ここで、key はフィルタのキー名、SIZE はフィルタが消費するバイト数です。
ブルーム カテゴリ
Bloom コマンドとデータへのアクセスを管理するには、@bloom カテゴリを使用します。このカテゴリに加えて、@read、@write、@fast のカテゴリでも Bloom コマンドが使用されます。
次の表は、Bloom コマンドを @read、@write、@fast、@bloom のカテゴリにマッピングできるかどうかを示しています。
| Bloom コマンド | @bloom |
@read |
@write |
@fast |
|---|---|---|---|---|
BF.ADD |
Y | × | Y | ○ |
BF.CARD |
○ | Y | × | Y |
BF.EXISTS |
○ | Y | × | Y |
BF.INFO |
○ | Y | × | Y |
BF.INSERT |
Y | × | Y | ○ |
BF.MADD |
Y | × | Y | ○ |
BF.MEXISTS |
○ | Y | × | Y |
BF.RESERVE |
○ | Y | × | Y |
Bloom コマンド
このセクションでは、Bloom データ型で Bloom オペレーションを実行するために使用できる Bloom コマンドについて説明します。
| コマンド | 説明 |
|---|---|
BF.ADD |
Bloom フィルタに単一のアイテムを追加します。フィルタが存在しない場合は、コマンドによって作成されます。 |
BF.CARD |
ブルーム フィルタのカーディナリティを返します。 |
BF.EXISTS |
ブルーム フィルタに指定した項目が含まれているかどうかを判断します。 |
BF.INFO |
ブルーム フィルタの使用状況情報とプロパティを返します。 |
BF.INSERT |
0 個以上のアイテムを含む Bloom フィルタを作成するか、既存のフィルタにアイテムを追加します。 |
BF.MADD |
1 つ以上のアイテムを Bloom フィルタに追加します。フィルタが存在しない場合は、コマンドによって作成されます。 |
BF.MEXISTS |
ブルーム フィルタに 1 つ以上のアイテムが含まれているかどうかを判断します。 |
BF.RESERVE |
指定したプロパティを持つ空のブルーム フィルタを作成します。 |
ブルーム フィルタを確認する
ブルームフィルタに関する次の情報を確認できます。
- メモリ使用量: フィルタがメモリ使用量の上限に達しているかどうかを確認します。フィルタが使用するメモリ量を確認するには、
BF.INFOコマンドを使用します。 - 容量: フィルタがスケーリング フィルタかどうかを確認します。容量に達するまでフィルタをスケーリングしてから、スケールアウトします。
Bloom フィルタのメモリ使用量と容量の確認について詳しくは、大規模な Bloom フィルタを処理するをご覧ください。