ユーザー用にさまざまな種類のカウンターを保存したいと考えています。プラットフォーム: 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 メモリ内にすべてを格納し、集約バックグラウンド スレッドを持ち、別のテクノロジを使用しないでください。
要約すると、私は次のことを心配しています:
- 行のロックを減らす
- 正確なカウンター(トランザクション?)
あなたのアイデアをありがとう:)