C# 在db中保存非常繁忙计数器的最佳实践

C# 在db中保存非常繁忙计数器的最佳实践,c#,sql-server,performance,entity-framework,web-services,C#,Sql Server,Performance,Entity Framework,Web Services,我正在开发一个非常繁忙的web服务,它应该每秒收到数千个请求。我希望每个请求都会更新一个计数器字段。我该怎么做?将计数器保存在db中非常重要,因此在服务器死机的情况下,我不会丢失信息。我已经尝试了下面的代码,但是对于每秒数千个请求来说,这将是一个巨大的瓶颈。 你会怎么做 public void Upload(int organizationId) { try { lock (UpadateLock) { using (var db = new DbConte

我正在开发一个非常繁忙的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)
   {

   }
}

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

问题是使用哪家商店

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

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

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


您也可以使用任何其他数据存储。如果它不支持本机递增,则可以插入新行。然后,有一个后台进程定期聚合这些行,这样它们就不会不断累积。

看看类似的问题:如果您的服务实例很少,那么您的解决方案就不起作用了:您将丢失计数器。最直接的方法是对每个请求调用
UPDATE..
sql。但是,如果每秒有数千个请求,这不是一个好主意。为什么这个柜台如此重要?将其保存在内存中并在后台线程中每隔5秒将快照放入数据库会更容易。@mtkachenko我已经考虑过你的想法,但我可能会丢失一些信息,以防服务器死机。@Dolev你可以将请求排队还是需要实时?@AmanB我可以创建一个单独的线程,在队列中等待更新数据库,缓存中还有一个单独的计数器,该计数器也将被更新。你是故意的吗?