1

ユーザー用にさまざまな種類のカウンターを保存したいと考えています。プラットフォーム: Java

たとえば、次のことを確認しました。

  • 現在のレコード数
  • 現在のステップ数
  • currentNumFlowsInterval1440
  • currentNumFlowsInterval720
  • currentNumFlowsInterval240
  • currentNumFlowsInterval60
  • currentNumFlowsInterval30

上記の各カウンターは、各ユーザーの毎月の初めにリセットする必要があります。各カウンターの値は、ピークなどで予測できないほど高くなる可能性があります(つまり、多くのものがカウントされるため、スケーラブルなソリューションを考えたいと考えています)。

今私の質問は、どのようなアプローチをとるかです:

a)ユーザー テーブルのカウンターごとに個別の列を用意し、「Update set counterColumn = counterColumn+ 1」のようなことを行う必要がありますか?

b)すべての値をある種の JSON/XML に入れ、それを 1 つの列に入れますか? (この場合、常にすべての値を一度に更新する必要があります)

私が見た欠点は、単一のカウンターがインクリメントされるたびにユーザーテーブルで行がロックされることです。

c) 3 つの列 (ユーザー ID、名前、カウンター) を持つ個別のカウンター テーブルを持ち、カウントごとに 1 つの INSERT を実行する + ユーザー テーブルに書き込まれる集計を行うバックグラウンド ジョブを実行する? この場合、集計されたカウンターを JSON としてユーザー テーブルの列に格納してもよろしいでしょうか?

d) MySQL ですべてを行うか、それとも別のテクノロジを使用しますか? また、カウンターを格納し、集計のみを MySQL に保持するための別のソリューションを使用することも考えました。たとえば、私は Apache Cassandra の分散カウンターを試しました。私の懸念は、cassandra にはないトランザクションに関するものです。カウンタは請求に使用されるため、正確である必要があります。したがって、Cassandra のスケーラビリティは魅力的ですが、Cassandra がここに適しているかどうかはわかりません。カウンターを格納する + MySQL に集計を書き込むための Redis はどうですか? Redis には、ここで役立つものがありますか? それとも、単純な Java HashMap メモリ内にすべてを格納し、集約バックグラウンド スレッドを持ち、別のテクノロジを使用しないでください。

要約すると、私は次のことを心配しています:

  • 行のロックを減らす
  • 正確なカウンター(トランザクション?)

あなたのアイデアをありがとう:)

4

2 に答える 2

0

矛盾したことを言っているようです。

カウント数が膨大になるか、少なくともユーザーごとに予測できない場合があります。

私にとってこれは、配列のように均一でなければならないことを意味します。無制限の量のコードと無制限の数の開発者の時間を費やさない限り、無制限の数の異種データを持つことはできません。

それらが均一である場合は、各行が形式であるテーブル user_counter にフラット化する必要があります(user_id, counter_name, counter_value)。ただし、必要なインデックスの種類などについては慎重に検討する必要があります。すべてゼロに設定されているか、デフォルト値が設定されている場合、月の初めに更新するのは 1 つの SQL クエリです。

基本的に(c)。(a) と (b) は最もばかげており、MySQL は依然としてこれに適したテクノロジです。

于 2012-11-26T19:35:09.303 に答える
0

あなたの要件はそれほど珍しいものではありません。一般に、これは統計的なセッション/ユーザー/... バインドされた書き込みデータです。

最初のことは、まだ分割していない場合は分割することです。ほとんどが読み取り専用のデータベースを作成し、これらのデータを個別に収集します。したがって、通常のプロパティ用に別のユーザー テーブル。

統計データは、メモリ内テーブルに保持できます。データベース、メッセージ キュー、セッション属性以外の手段を使用することもできます。

于 2012-11-26T20:52:40.237 に答える