2

毎日、毎週、そしていつでもカウンターを作りたいです。私のデータベースの各製品には、週次、日次、および全時間のカウンターがあります。私の目標は、cronジョブを模倣できるようにすることです。これが正しい方法かどうか聞きたいです。

デイリーカウンターのみをターゲットにするとします。製品のテーブルのデータベースには、「daily_counter」という行があります。製品ごとに、ゼロに初期化されます。別のテーブルには'for_Day'、日次カウンターが適用されるその日を保持する1つの行のみが呼び出されます。

また、テーブルに対応するアプリケーション変数を1行で初期化し、「for_day」の値をApplication["for_day"]変数に読み込みます。これは、アプリケーションが最初に起動したときにのみ発生します。

各ユーザーの製品ページのビューごとに、次のことを行います(C#を使用)

当日の番号を取得する

Int current_day = DateTime.Now.Day;

現在の日をアプリケーションの内容と比較します["for_day"]

if(current_day == Application["for_day"]){ // same day from last counter reset
 // do nothing
}

それらが等しい場合は何もしません。

else if(current_day > Application["for_day"]){ // new day

 1. Reset the daily counter in the database to zero
 2. Application["for_day"] = current_day;
 3. Update the column for_day in the database to current_day

}

このチェックは、自分のWebサイトにアクセスするユーザーごとに行います。これは1日に1回だけ実行し、先日サイトにアクセスした最初のユーザーのデータベースの日次カウンターを0にリセットする必要があります。最初のユーザーが2日後に来たとしても、それに応じてデータが更新され、すべてのユーザーに当日の新しいカウンターが表示されるため、問題なく動作するはずです。

これはcronjobよりも望ましいと思い、application_Startでのみ、最大で1日に1回だけデータベースにクエリを実行します。ロードバランサーの複数のサーバーでWebアプリを起動すると、ソリューションが機能するはずです。データベースはリモートロケーションにあり、各サーバーに抵抗しないため、これは正常に機能するはずです。

このテクニックについて、期待どおりに機能するかどうか、改善する方法があるかどうかについて、ご意見をお聞かせください。私は外部のcronjobサービス/サーバーに依存していないので、これを好みます。すべてが私のアプリケーションにあります。

私はASP.NETとC#でアプリケーションを開発しており、Windows 2008サーバーにインストールし、ロードバランサー(おそらくAmazon AWS ElasticBeans)の背後で実行します。

ありがとう

4

1 に答える 1

3

これは、いくつかの理由から悪い考えです。

  • 誰もアクセスしていないためにアプリケーションがアンロードされると、すべてのアプリケーション変数値が失われます(デフォルトのアプリのリサイクル時間は20分だと思います)。
  • 複数のスレッドがこのコードを実行しようとすると、競合状態に対処する必要があります。
  • 同じユーザーが同じ製品数を複数回インクリメントしないようにするにはどうすればよいですか?

このスレッドにはいくつかの良いアイデアがあります:

  • ビューカウントは、ヒットするたびにデータベースに直接保存されます。
  • 毎日のCookieまたは日固有のリソースURLを使用して、同じユーザーによる複数のヒットを防止します(これは回避できますが、ユーザーの99.9%は試行しません)-副次的な利点として、これはクライアント側であるため、ユーザーがすでに製品にアクセスしているので、別のデータベースヒットを引き起こす必要はありません。
于 2013-01-19T02:46:12.740 に答える