ホームページ  >  記事  >  バックエンド開発  >  Redis で一意のカウントを実装する 3 つの方法

Redis で一意のカウントを実装する 3 つの方法

高洛峰
高洛峰オリジナル
2017-02-08 09:39:572163ブラウズ

ユニークカウントは、Web サイトシステムで非常に一般的な機能です。たとえば、Web サイトでは、毎日訪問するユニークビジター (UV とも呼ばれます) の数をカウントする必要があります。カウントの問題は非常に一般的ですが、解決するのが非常に複雑になる場合があります。まず、カウントする必要がある量が非常に大きくなる可能性があります。たとえば、大規模なサイトには毎日何百万人もの人々がアクセスし、データの量は非常に多くなります。次に、通常は、毎日の UV に加えて、週ごとまたは月ごとの UV も把握する必要があるため、計算が非常に複雑になります。

リレーショナル データベース ストレージ システムで、一意のカウントを実装するメソッドは select count(distinct 9582cf303f30b9f4319d93f9b5ae353f) です。これは非常に簡単ですが、データ量が大きい場合、このステートメントの実行は非常に遅くなります。リレーショナル データベースを使用する場合のもう 1 つの問題は、データ挿入のパフォーマンスが高くないことです。

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

1. セットに基づいたセット

Redis は、セット内に要素が存在するかどうかを迅速に判断し、さらにセット内の要素の数を迅速に計算するために使用されます。セットを新しいコレクションにマージします。関連するコマンドは次のとおりです:

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

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

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

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

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

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

3. HyperLogLog

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

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

このカウント方法はまだ完全には理解していませんが、興味がある方は関連記事を読んでみてください。

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

Redis で一意のカウントを実装する 3 つの方法については、PHP 中国語 Web サイトに注目して関連記事を共有してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。