在Web园/场中共享静态类数据

时间:2009-08-04 22:58:50

标签: asp.net

情景:

  • ASP.NET网站
  • 包含TONS配置数据的全局静态类
  • 静态数据大多是只读的,但它可以偶尔改变一次
  • 静态类中的数据必须始终是实时的

现在,这在单个工作进程中非常有用,所有配置数据始终在内存中(仅在对数据进行修改时才将更改写入磁盘),并且因为它使用很多,它将应用程序的速度提高了几个数量级(与存储在数据库中并在每次请求时查询它相比)

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

我正在寻找的是实时同步机制

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

1 个答案:

答案 0 :(得分:1)

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

重量轻,可以轻松触发数据重新加载。只要文件暂时没有改变,操作系统应该在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.*/);

我之前没有用过这个,所以我不太了解它是如何工作的。