Asp.net 通过web garden/farm共享静态类数据

Asp.net 通过web garden/farm共享静态类数据,asp.net,Asp.net,情景: ASP.NET网站 包含大量配置数据的全局静态类 静态数据基本上是只读的,但它可以每隔一段时间更改一次 静态类中的数据必须始终是实时的 现在,这在一个单工作进程中非常有效,所有配置数据始终都在内存中(只有在对数据进行修改时才将更改写入磁盘),而且由于它被大量使用,因此应用程序的速度提高了几个数量级(与将其存储在数据库中并在每次请求时对其进行查询相比) 您将如何转换此应用程序,使其可以在web花园甚至web场环境中使用? 我要找的是一个实时同步机制 显然,问题是每个工作人员都有自己的静

情景:

  • ASP.NET网站
  • 包含大量配置数据的全局静态类
  • 静态数据基本上是只读的,但它可以每隔一段时间更改一次
  • 静态类中的数据必须始终是实时的
现在,这在一个单工作进程中非常有效,所有配置数据始终都在内存中(只有在对数据进行修改时才将更改写入磁盘),而且由于它被大量使用,因此应用程序的速度提高了几个数量级(与将其存储在数据库中并在每次请求时对其进行查询相比)

您将如何转换此应用程序,使其可以在web花园甚至web场环境中使用?

我要找的是一个实时同步机制


显然,问题是每个工作人员都有自己的静态类数据副本;我对我将采取的方法有一些想法,但想看看人们还有什么想法

您可以检查文件系统上共享文件的日期。每次配置数据更改时,只需触摸该文件即可更改修改日期。将程序上次加载数据的日期与文件的日期进行比较。如果文件的日期较新,请重新加载数据,并更新上次加载的日期

它重量轻,允许您轻松触发数据重新加载。只要文件在一段时间内没有更改,操作系统就应该在ram中保留大部分文件元数据

虽然我没有进行性能比较,但我始终发现这种方法是一种健壮且易于实现的方法,可以将“重新加载缓存”消息传递给所有客户端

DateTime cacheDate = DateTime.Now.AddHours(-1);
DateTime fileDate = System.IO.File.GetLastWriteTime(@"C:\cachefile.txt");
if(fileDate > cacheDate)
{
    //Reload cache
    cacheDate = DateTime.Now;
}
//Get Cached Data
您还可以使用HttpContext缓存

Context.Cache.Add(key, val, 
    new System.Web.Caching.CacheDependency(@"C:\cachefile.txt"),  
    System.Web.Caching.Cache.NoAbsoluteExpiration, 
    System.Web.Caching.Cache.NoSlidingExpiration, 
    System.Web.Caching.CacheItemPriority.Default, 
    null/* or your Callback for loading the cache.*/);

我以前没有以这种方式使用过它,所以我对它的工作原理不太了解。

感谢您的回答,数据驻留在数据库中,但这种技术可以应用