想实现数据的一些统计,比如用户多种积分,发帖数,评论数等等,版块的总帖数,总评论;数诸如类似。
举例: 用户发帖增长积分,更新发帖数统计,同样版块帖子统计变化,又或者还会有其他的统计变化。
针对这种情况是直接在需要的地方通过数据表count()统计还是在表中新增各个的统计字段,触发时候通过事务来完成呢?
我个人偏向于后面这种,但又觉得统计数据用事务来保证数据统计一致性又有点不合理??
但是话又说回来,不采用事务,有些地方又会因为统计错误造成一些错误,类似分页错误?
各位大神有什么好的思路或者建议呢?求指点!
データ量が大きい場合、データベースはこの種のクエリ、特にユーザーに対するこの種のクエリを処理できません。
定期的にカウントしてからキャッシュに入れます
私はマスターではありませんが、やるならこのようなデータをredisに入れます。
[背景]
1 この問題は、データベースのパフォーマンスが既存のビジネス シナリオを満たしていないことが原因で発生します
2 提供されたビジネス シナリオによれば、データには特定のエラーが許容されます
【プログラム構成】
既存のプログラム構造はデータベースを直接呼び出して動作しますが、現時点ではデータベースの性能が要件を満たせないため、データベース間に[カウンター]の層を追加する必要があります。
リーリープログラムの調整の前後に、データベースの[追加]、[削除]、[変更]の3つのリンクに[アスペクト]を追加する必要があります。これはフックとしても理解できます
。 Redisは永続化できるため、通常[カウンター]に使用されます
【要注意】
1 DBの動作は正常でも、Redisの動作が失敗するため、データエラーが発生する可能性があります
2 エラーが発生する可能性があるため、エラー修正メカニズムが必要です。このメカニズムにより、サーバーへの負荷を軽減できます。小規模な場合は、mysql のカウントまたは合計を使用して
3 を更新するか、別の [トランザクション メカニズム] を使用して DB および Redis 操作のアトミック性を確保します。
InnoDB のカウントはすべてのデータ行をリアルタイムでスキャンする必要があるため、時間がかかります
Myisam はあまり使用すべきではありません
推奨事項
数据表添加统计字段
統計はバックエンド サービスを使用して処理されます。たとえば、バックエンドはスレーブに接続されていますが、ビジネスには影響しません。
初めての人は、データの蓄積に count() 形式を使用することはお勧めしません。累積形式を使用することをお勧めします。
新しいデータが追加されるたびに count() を使用してカウントする必要があるため、データベースにとって非常に負担がかかります。
そのため、これを行うことをお勧めします:
1. すべての統計データを保持するには、nosql を使用します。
2. 新しいデータを追加するときに、モジュールをトリガーして、対応するデータを蓄積し、元のデータを上書きします。
3. nosql ダウンの問題が確実に発生するようにするには、対応する統計データをデータベースに保存し、nosql データを定期的にデータベースに保存するロジック モジュールを作成することをお勧めします。
4. もちろん、定期的に count を使用して (これはサーバーがアイドル状態のときに実行できます)、統計が正しいかどうかを再確認することもできます