ホームページ  >  記事  >  データベース  >  Redis で重複を削除するにはどうすればよいですか?重複を削除する 4 つの方法の簡単な分析

Redis で重複を削除するにはどうすればよいですか?重複を削除する 4 つの方法の簡単な分析

青灯夜游
青灯夜游転載
2021-11-09 10:03:467885ブラウズ

Redis で重複を削除するにはどうすればよいですか?次の記事では、Redis の重複排除の 4 つの方法を紹介します。

Redis で重複を削除するにはどうすればよいですか?重複を削除する 4 つの方法の簡単な分析

#この記事では、Redis で一意のカウントを実現するための 3 つの方法を主に紹介します。この記事では、SET ベース、ビットベース、およびベースの 3 つの方法について説明します。 HyperLogLog. 友達は、

ユニーク カウントは Web サイト システムで非常に一般的な機能です。たとえば、Web サイトでは、毎日訪問するユニーク ビジター (つまり、UV) の数をカウントする必要があります。カウントの問題は非常に一般的ですが、解決するのが非常に複雑になる場合があります。まず、カウントする必要がある量が非常に大きくなる可能性があります。たとえば、大規模なサイトには毎日何百万人もの人々がアクセスし、データの量は非常に多くなります。非常に大きい; 次に、通常はカウントの次元を拡張することが望ましいです。たとえば、日次 UV に加えて、週次または月次の UV も知りたい場合は、計算が非常に複雑になります。 [関連する推奨事項:

Redis ビデオ チュートリアル ]

リレーショナル データベースに格納されたシステムで、一意のカウントを実現する方法は select count(distinct ) です。これは非常に簡単です。ただし、データ量が多く、このステートメントの実行が非常に遅い場合。リレーショナル データベースを使用する場合のもう 1 つの問題は、データ挿入のパフォーマンスが高くないことです。

Redis は、この種のカウント問題を簡単に解決できます。リレーショナル データベースよりも高速で、消費するリソースも少なくなります。3 つの異なる方法も提供します。

1. set

Redis に基づくセットは、一意のデータ コレクションを保存するために使用されます。これにより、コレクション内に要素が存在するかどうかをすばやく判断できます。また、セット内の要素の数をすばやく数えたり、セットを新しいセットにマージしたりすることもできます。関連するコマンドは次のとおりです:

コードを次のようにコピーします:

SISMEMBER key member  # 判断 member 是否存在
SADD key member  # 往集合中加入 member
SCARD key   # 获取集合元素个数

セットベースの方法はシンプルかつ効果的で、正確なカウントが可能で、幅広い用途に使用でき、理解しやすいですが、欠点は次のとおりです。大量のリソースを消費しますが (もちろんリレーショナル データベースよりもはるかに少ないですが)、要素の数が多い場合 (数億など)、メモリの消費量が膨大になります。

2. ビットベースのビット

Redis を使用すると、セット メモリよりも高度に圧縮されたカウントを実装できます。ビット 1 または 0 を使用して、ビット 1 または 0 を保存します。要素は情報が存在します。たとえば、Web サイトへのユニーク訪問者数の場合、user_id をビットのオフセットとして使用できます。アクセスを示すには 1 に設定します。1 MB のスペースを使用すると、800 万人を超えるユーザーの 1 日のアクセス数を保存できます。 。関連するコマンドは次のとおりです。 次のようにコードをコピーします:

SETBIT key offset value  # 设置位信息
GETBIT key offset        # 获取位信息
BITCOUNT key [start end] # 计数
BITOP operation destkey key [key ...]  # 位图合并

ビットベースのメソッドは、set メソッドより消費するスペースがはるかに少なくなりますが、要素をビット オフセットに単純にマップできる必要があり、適用可能な範囲ははるかに狭いです。また、多くのスペースを消費します カウント値に関係なく、最大オフセットに依存します 最大オフセットが大きい場合、メモリの消費も大きくなります。

3. HyperLogLog に基づく

非常に大量のデータを正確に一意にカウントすることは困難ですが、単なる近似値であれば、効率的なものが多数あります。計算科学におけるアルゴリズムの中で、HyperLogLog Counting は非常に有名なアルゴリズムであり、数億の一意のカウントを達成するために使用できるメモリは約 12,000 のみで、誤差は約 1% に制御されています。関連するコマンドは次のとおりです。 次のコードをコピーします:

PFADD key element [element ...]  # 加入元素
PFCOUNT key [key ...]   # 计数

この計数方法は本当に素晴らしいです。統計には一様分布、ランダム確率、ベルヌーイ分布などが含まれます。完全には理解できませんが、興味があります。関連する記事を詳しく調べます。

redis が提供する 3 つの独自のカウント方法にはそれぞれ長所と短所があり、さまざまな状況でのカウント要件を完全に満たすことができます。

4. ブルームフィルターに基づく

ブルームフィルターは、ビットマップまたはビットセットに似たデータ構造を使用してデータを保存し、ビット配列を使用してデータを簡潔に保存します。セットを表し、このコレクションに要素がすでに存在するかどうかをすぐに判断できます。 BloomFilter は 100% 正確ではありませんが、パラメータ、使用するハッシュ関数の数、ビット配列のサイズを調整することでエラー率を減らすことができます。この調整により、エラー率を完全に 0 に近づけることができます。ほとんどのシナリオに対応できます。

セット S = {x1, x2, … xn} がある場合、ブルーム フィルターは k 個の独立したハッシュ関数を使用して、セット内の各要素を {1,…,m} の範囲にマップします。どの要素についても、マッピングされた番号が対応するビット配列のインデックスとして使用され、ビットは 1 に設定されます。たとえば、要素 x1 はハッシュ関数によって数値 8​​ にマッピングされ、ビット配列の 8 番目のビットは 1 に設定されます。以下の図では、集合 S には x と y の 2 つの要素しかなく、それぞれ 3 つのハッシュ関数によってマッピングされています。マッピングされた位置はそれぞれ (0, 3, 6) と (4, 7, 10) であり、対応するビットは1:

Redis で重複を削除するにはどうすればよいですか?重複を削除する 4 つの方法の簡単な分析

#このセットに別の要素が含まれているかどうかを確認したい場合は、これら 3 つのハッシュ関数でマップするだけで確認できます。対応する位置に 0 がある場合、存在する場合、この要素がこのセットに確実に存在しないことを意味し、そうでない場合は存在する可能性があります。

Redis でブルーム フィルターを使用するにはプラグインをインストールする必要があります: https://blog.csdn.net/u013030276/article/details/88350641

プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !

以上がRedis で重複を削除するにはどうすればよいですか?重複を削除する 4 つの方法の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。