0

Ruby on Rails サイトに取り組んでいます。

パフォーマンスを向上させるために、さまざまな統計のキャッシュをいくつか構築して、将来それらを表示するときに、すべてのデータベース レコードを取得してそれらの統計を計算するのではなく、キャッシュを表示するだけでよいようにしたいと考えています。

例:

モデル ユーザー has_many コメント。コメントの数をユーザー キャッシュ モデルに保存したいと思います。そうすれば、ユーザーが行ったコメントの数を表示する必要がある場合、それは統計モデルの単純なクエリだけです。新しいコメントが作成または破棄されるたびに、カウンターが増減するだけです。

サイトの稼働中にこれらの統計を作成するにはどうすればよいですか? 私が懸念しているのは、データベースにユーザーのコメント数をカウントするように要求した後、コマンドを実行して統計に保存する前に、そのユーザーが忍び込んで別のコメントをどこかに追加する可能性があることです。これによりカウンターがインクリメントされますが、すぐに他のスレッドによって上書きされ、誤った統計が保存されます。

私は ActiveRecord トランザクション ブロックに精通していますが、理解しているように、それらはデータベース上のデータのミューテックス保護として機能するのではなく、全体としてすべてまたはまったく成功しないことを保証するためのものです。

このような変更のために、基本的にサイトを削除する必要がありますか?

4

3 に答える 3

1

あなたのユースケースはすでにレールによって処理されています。これはカウンターキャッシュと呼ばれます。ここにレールキャストがあります:http://railscasts.com/episodes/23-counter-cache-column

古いものですので、古くなっている可能性があります。ただし、一般的なアイデアはそこにあります。

于 2012-04-18T21:50:59.053 に答える
0

通常、アプリケーションとレポート ロジックを混在させることはベスト プラクティスではありません。レポート データをアプリケーションの外部に送信して、デーモンによって読み取られるログ ファイルを別のデータベースに送信するか、ストレージの詳細を処理する他の A​​PI に送信します。

あまりにも多くの作業のように聞こえる場合は、リアルタイムのレポートは必要ありません。何らかのバックアップ (ホットまたはコールド) があると仮定して、集計を実行し、バックアップに関するレポートを生成します。そうすれば、実行中のアプリケーションに影響を与えず、データが 24 時間以上古くなることはありません。

于 2012-04-18T21:01:14.960 に答える
0

参考までに、ここで解決策を見つけたと思います:

http://guides.ruby.tw/rails3/active_record_querying.html#5

私が探しているのは悲観的ロックと呼ばれるもので、2.10.2 で対処されています。

于 2012-04-18T21:48:32.840 に答える