この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 6755|答える: 3

[出典] .NET/C#はRdisを使ってBitMapベースのブルームアルゴリズムを実装しています

[リンクをコピー]
掲載地 2023/01/02 17:37:01 | | | |
要件:最近、BilibiliでRedis Bloomアルゴリズムの動画を見ました。キャッシュ侵入の問題を解決するためのもので、簡単に言えば、データベースにアクセスする前に論理的判断の層を加えてデータが存在するかどうかを判断し、存在する場合はデータベースにアクセスすることです。 例えば、ウェブサイトがニュースシステムであり、記事のURLは自己増分の主要キーID(URLフォーマット example:/news-1.html)によって生成され、ウェブサイトには数万件の記事やキャッシュしかない場合もあります。

もともとは:

ニュースリソースのリクエスト -> キャッシュの存在を判断 -> プレゼンス -> キャッシュはデータを返します。
ニュースリソースのリクエスト -> キャッシュが存在するかどうかを判断 -> 存在しない -> データベースからのクエリ -> 提供 -> キャッシュとデータを返す。
ニュースリソースをリクエストする -> キャッシュが存在するかどうかを判断 -> 存在しない -> データベースからのクエリ -> 存在しない -> 404エラーを返す。

今すぐ:

ニュースリソースをリクエスト -> ブルームのアルゴリズム -> 存在 -> 元の論理に従う。
ニュースリソースをリクエスト -> ブルームのアルゴリズム -> は存在しません -> 直接404エラーを返します。

ブルームフィルター

BloomFilterアルゴリズムはビッグデータのスケジューリングアルゴリズムです。 大量のデータを持つ集合では、対象がその集合に含まれていないことを正確に判定できます。 集合の中の対象を判断しても、ほとんどスペースを取らないことは可能です。 それ高精度かつ誤差ゼロが求められる状況には適していません。 部分的な精度を犠牲にすることでスペースの効率的な利用が実現されます。

ブルームのアルゴリズムは、一定の精度を犠牲にして、メモリ消費の少ないフィルタリングアルゴリズムを採用するこれは大量のデータに対してフィルタリング、重複除去、その他の操作を実現できます。

Bloomアルゴリズムは抽象的な概念であり、さまざまな方法で実装可能です。記事でRedisでBitMapを使うのは単なる実装に過ぎません。

参考:ハイパーリンクのログインが見えます。

ビットマップの紹介

ビットマップはビットマップであり、実際にはバイト配列で二進数で表現されています。数字は0と1の2つだけです、ビットマップは各2進ビットを使って要素に対応する値を保存またはマークします。 ビットマップはビット単位で保存されるため、特定のデータが存在するかどうかを判定するために通常使われます。

下図に示すように、文字列はコンピュータ内でバイナリ形式で格納されています。



Redisにおけるビットマップデータ型

Redisが提供するデータ型はBitMapで、各ビットは0と1の2つの状態に対応しています。 内部ストレージは依然としてString型ですが、RedisはBitMapを直接操作するための命令を提供しており、BitMapはビット配列と考えられます。配列の添字がオフセットです。

その利点は以下の通りです:低メモリオーバーヘッドと高効率そして、その作戦はシンプルです。

スペース節約:ビットは要素の値や状態を表すために使われ、keyは対応する要素の値です。 実際、8ビットでバイトを構成できるため、スペースの節約にもなります。
高効率:setbitとgetbitの時間計算量はO(1)であり、他のビットの効率も高いです。

セットコレクションとBitMapストレージの使い方の例を挙げます:

データ型各ユーザーIDは容量を占有します保存すべきユーザー数すべてが記憶を占める
セット32ビットは4バイト(ユーザーIDが整数を使うと仮定し、多くのウェブサイトは実際には長整数を使用しています)50,000,00032ビット * 50,000,000 = 200 MB
ビットマップ1ビット100,000,0001ビット * 100,000,000 = 12.5 MB


時間が少し伸びている

一日一月一年
セット200M6G72G
ビットマップ12.5M375M4.5G


計算の結果、時間が経つにつれて記録すべきデータ量が増え、コントラストがより明確になり、ビットマップの占有容量が設定より少ないことが分かりました。

RedisはBitMapの操作方法として以下の手順を提供しています:

命令説明利用可能なバージョン時間計算量
ハイパーリンクのログインが見えます。キーに格納された文字列値の指定されたオフセット上のビットを設定またはクリアします。>= 2.2.0O(1)
ハイパーリンクのログインが見えます。キーに格納された文字列の値については、指定されたオフセット上のビットを取得します。>= 2.2.0O(1)
ハイパーリンクのログインが見えます。与えられた文字列で1に設定されているビット数を数えます。>= 2.6.0O(N)
ハイパーリンクのログインが見えます。ビットマップ上で最初の値がビットとなるバイナリビットの位置を返します。>= 2.8.7O(N)
ハイパーリンクのログインが見えます。バイナリビットを保持する1つ以上の文字列キーに対するビット操作。>= 2.6.0O(N)
ハイパーリンクのログインが見えます。BITFIELDコマンドは、単一の通話で複数のビットレンジを同時に処理できます。>= 3.2.0O(1)


コマンドドキュメント:ハイパーリンクのログインが見えます。

アルゴリズムとRedisのビットマップ機能、構文をざっと理解したところで、redisを使って簡単な操作を行いましょう。

SETBIT構文:SETBITキーオフセット値

記事 id:9, 10, 156 を 1 に設定すると、コマンドは以下の通りです:

GETBIT構文:GETBITキーオフセット

id: 10 または 11 の存在を判定するコマンドは以下の通りです:




.NET/C#はRedisのBitMap型を操作します

RedisでいくつかのBitMapコマンドについて学び、それらをプログラム的に操作する方法を学びました。 新しい.NET 3.1コンソールプロジェクトを作成し、StackExchange.Redisパッケージを参照して、以下のコマンドを使用します。

ソースコードは以下の通りです:



Redisには他にも多くのビットマップアプリケーションがあります。以下のように。

  • ユーザーが特定の操作を行ったかどうかを判断するための簡単なブルームフィルターとして利用できます。
  • ユーザーの日次活動、月間活動、定着率の統計
  • ユーザーローンチ数の統計を把握しましょう
  • ユーザーのオンラインプレゼンスと人物統計

(終わり)




先の:バーチャル俳優:Dapr vs Orleans
次に:アリババクラウド SLB ロードバランシング 503エラー解決
 地主| 掲載地 2023/01/02 17:41:56 |
掲載地 2023/01/02 20:42:47 |
学びました、ありがとうございます、そして知識を得ました
掲載地 2023/01/06 20:34:22 |
学ぶために
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com