1

ページが読み込まれるたびにインクリメントする必要のあるカウンターキャッシュがあるとします。10個のWebインスタンスがあるとします。カウンターキャッシュ列を一貫して増やすにはどうすればよいですか?

1つのWebインスタンスで一貫性を保つのは簡単です。ただし、いくつかのインスタンスが実行されていると、競合状態が発生する可能性があります。

ここに簡単な説明があります。カウンターキャッシュ列が呼び出されfoo_counts、その開始値が0であるとします。2つのWebインスタンスが同時にロードされると、両方ともカウントを0として認識します。カウントを増やすときが来ました。どちらもカウントを0から1にインクリメントします。

http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-updateを見ました

任意のアイデアをいただければ幸いです。

4

2 に答える 2

5

あなたが使用することができますupdate_counter

インクリメントカウンター(カウンター名、ID)

通常はカウントを表す数値フィールドを1つインクリメントします。

これはSQLで直接UPDATEを実行するためModel.increment_counter(:c, 11)、このSQLをデータベースに送信します。

update models set c = coalesce(c, 0) + 1 where id = 11

したがって、競合状態について心配する必要はありません。データベースにその仕事をさせましょう。

于 2012-08-11T01:31:59.773 に答える
0

インクリメントをキューに入れ、ワーカーにバックグラウンドで実際のインクリメントを実行させることを検討してください。完全にミリ秒までのデータはありませんが、少なくとも正確です。

于 2012-08-11T01:02:49.007 に答える