1

スタック オーバーフロー プロファイル ページと同様のユーザー統計 (合計アクセス数、バッジ数など) を含むサイドバーがあるユーザー プロファイル ページがあります。

問題は、現在、データベースにアクセスして、すべてのリクエストでこれらの統計を計算していることです。これを削減するためにフラグメント キャッシングを実装できますが、この種のことを処理するためのより良い方法はありますか?

集計された要約データをデータベースに保存すると、問題 (つまり、不整合) が発生する可能性があるようです。

4

2 に答える 2

6

次を使用して、この情報を再計算する代わりにデータベースに保存できます。

  1. カウンターキャッシング
  2. カスタム コールバック

カウンターキャッシング

User例として、バッジの数を測定する場合、という名前のデータベース フィールドを作成badges_countし、Badge モデルで を作成できますbelongs_to :user, :counter_cache => true。これで、バッジの数が変わるたびに、 で新たに計算することなくカウントにアクセスできます@user.badges_count

基本的な実装: http://asciicasts.com/episodes/23-counter-cache-column

カスタム コールバック

単純なカウントよりも複雑な動作を測定するフィールドがあるとします。この場合、 、 、 などを使用して特定のアクションが発生するたびにフィールドを更新するコールバックを実装するbefore_saveだけafter_saveですbefore_create

矛盾に関する懸念

データベースにデータを保存することは、間違っている場合にのみ一貫性がなくなります。統計を更新できるパスの数は限られているため、使用しているフィールドを更新する際にすべてのパスがカバーされるようにする必要があります。Rails は counter_caching を使用してこれを行います。カスタム コールバックを使用する場合や異常な状況が発生した場合は、自分で行う必要があります。

于 2011-09-10T21:24:01.810 に答える
0

この質問のように非表示の div を使用できます ( 非表示の div を使用してデータをキャッシュする)。キャッシュするデータの量によっては、これが適切な解決策になる場合があります。

于 2011-09-10T22:12:21.520 に答える