2

我想创建一个计数器,每天,每周和所有时间。我数据库中的每个产品都会有一个每周、每天和 all_time 计数器。我的目标是能够模仿 cronjob。我想知道这是否是正确的做法。

假设我将只针对每日计数器。在我的产品表中的数据库中,我将有一行名为'daily_counter'。对于每个产品,它将被初始化为零。另一个表将只有一行被调用'for_Day',该行包含每日计数器适用的那一天。

我还将用一行初始化与表对应的应用程序变量,并将“for_day”中的值读取到Application["for_day"]变量中。这只会在应用程序第一次启动时发生。

对于每个用户的产品页面的每个视图,我将执行以下操作(使用 C#)

获取当前日期编号

Int current_day = DateTime.Now.Day;

将当前日期与 Application["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

}

我对访问我网站的每个用户进行此项检查。这应该每天只运行一次,并将数据库中的每日计数器重置为 0,以便前几天访问该站点的第一个用户。即使第一个用户在两天后出现,它仍然应该可以正常工作,因为它会相应地更新数据,并且所有用户都会看到当天的新计数器。

我认为这比 cronjob 更可取,我只在 application_Start 查询数据库,并且每天最多查询一次。在负载均衡器的多台服务器上启动我的 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 回答