1

これを設定するために、ユーザーとこれらのユーザーを説明する一連のタグを持つ会社があります。各ユーザーには、最大 5000 個のタグを付けることができます。

クライアントが特定のタグを選択してタグ グループを作成できるようにするエンジンがあります。エンジンには、AND/Or 機能と包含/除外機能があります。クライアントはタグ グループを作成でき、当社のエンジンはタグ グループで指定された論理要件を満たすユーザーの総数を見つけます。基本的に、これは単なる交差、結合、および除外であるため、redis セットは完璧です。

これを処理するために、データをそのまま保存します。Tag1:[user1, user2,user3] Tag2:[user1, user5, user6] など

ここから、すべての bool ロジックはスクリプトを使用して実行されます。

しかし、当社の顧客基盤は急速に拡大しています。数年以内に、いくつかの 64 GB の redis サーバーまたは代替サーバーが必要になります。

これが私の質問です。ディスクベースのインターセクトとユニオンを実行するための非常に高速な DB オプションはありますか? Postgres を試してみましたが、パフォーマンスは受け入れられません。たとえば、500k ユーザー セットのセット比較には 1 秒かかります。Postgres では約 30 秒かかりましたが、タグ グループに多くのタグがある場合はそれ以上かかりました。

私は DynamoDB を推奨し、他にもいくつかありましたが、深く掘り下げる前に、知識に基づいた意見が欲しかっただけです。

ありがとう、ダン

4

3 に答える 3

3

「超高速DB」と「ディスクベース」は、あまり互換性がありません。最速のストアはメモリ内ストアです。

intset の使用に加えて、別の可能な最適化は、セットをビットマップとして表すことです。それはすべてデータのカーディナリティに依存しますが、ユーザー数がタグ数よりも速く増加すると仮定すると、タグごとに 1 つのビットマップを持つことが興味深い場合があります。ビットマップでは、特定のビットがユーザーの数値 ID によってインデックス付けされます。

Redis 2.6 は、まさにこの目的のために、 SETBITBITOP、およびBITCOUNT操作をサポートしています。

ユーザーごとに 1 ビットの場合、500K ユーザーは 64K 未満で、タグのグローバル数を掛けることができます。intset を使用するよりもさらにコンパクトであることがわかると思います。

于 2012-09-06T22:23:44.547 に答える