在数据库中保存非常繁忙的计数器的最佳实践

时间:2019-05-02 06:35:03

标签: c# sql-server performance entity-framework web-services

我正在开发一个非常繁忙的Web服务,该服务应该每秒接收数千个请求。我希望每个请求都将更新一个计数器字段。我该怎么办?将计数器保存在db中非常重要,因此万一服务器死机,我也不会丢失信息。我已经尝试了以下代码,但这将成为每秒数千个请求的巨大瓶颈。 你会怎么做?

public void Upload(int organizationId)
{
  try
  {
    lock (UpadateLock)
    {
       using (var db = new DbContext())
       {
         Counter counter = db.Counters.Where(c => c.OrganizationId == organizationId).FirstOrDefault();
         counter.count++;
         db.SaveChanges();

       }
     }
   }
   catch (Exception ex)
   {

   }
}

1 个答案:

答案 0 :(得分:0)

如果服务器死机时绝对不能丢失数据,则必须为每个增量写一个持久性存储。

问题只是要使用的存储空间

您当然可以使用SQL做到这一点。这样的简单查询并不太昂贵。您可以对此进行基准测试,以查看开销是否可以接受。测量Web服务器和SQL Server上的CPU使用率。还要测量磁盘使用情况和事务日志大小。

事实证明,Redis可能是一个非常好的数据库。众所周知,它速度很快,并且支持服务器端增量。

您还可以通过将增量写入多个服务器(随机选择一个服务器)来扩展此工作负载。

您也可以使用任何其他数据存储。如果它不支持本地增量,则可以插入新行。然后,进行后台处理,以定期汇总这些行,以免它们不断累积。