ASP.Net缓存共享

5

我有一个ASP.Net 4.0的网络应用程序,它经常从数据库加载数据并对其进行复杂计算。我想将这些加载和准备好的数据缓存在一个中央缓存中,以便每个使用该应用程序的用户和计算机都可以访问。

简单的使用情况:

  • 用户1访问网页,缓存为空,数据被加载/计算,数据被缓存
  • 用户2访问网页,缓存包含数据,从缓存中加载数据
  • 用户3访问网页,缓存包含数据,从缓存中加载数据
  • 用户1重新加载网页,缓存包含数据,从缓存中加载数据
  • 缓存过期
  • 用户3刷新网页,缓存为空,数据被加载/计算,数据被缓存

我知道ASP.Net有一个内置的缓存机制。我不知道的是它是否可以在不同用户同时在不同计算机上访问站点时共享。 我还想了解系统在Web Farm环境下的行为。

3个回答

9
虽然其他人已经提到了内置的ASP.NET缓存(System.Web.Caching),但请注意,.NET 4.0引入了一个全新的缓存框架,旨在在System.Web.Caching命名空间之外工作:

System.Runtime.Caching

http://msdn.microsoft.com/en-us/library/system.runtime.caching(VS.100).aspx

现在,这比简单的System.Web.Caching的缓存项要复杂得多。但是,您可以获得具有多个缓存存储区、缓存对象/键锁定以及创建自己的外部缓存提供程序(例如 Microsoft 的新 Velocity 分布式缓存系统)的扩展性点的优势。它带有内置的MemoryCache提供程序。
使用它并不难。直接从MSDN关于内置MemoryCache提供程序的文章中(您可以实现自己的),在WinForms应用程序中使用它(您需要为Web应用程序更改代码):

http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

ObjectCache cache = MemoryCache.Default;
string fileContents = cache["filecontents"] as string;

if (fileContents == null)
{
    CacheItemPolicy policy = new CacheItemPolicy();

    List<string> filePaths = new List<string>();
    filePaths.Add("c:\\cache\\example.txt");

    policy.ChangeMonitors.Add(new 
    HostFileChangeMonitor(filePaths));

    // Fetch the file contents.
    fileContents = 
        File.ReadAllText("c:\\cache\\example.txt");

    cache.Set("filecontents", fileContents, policy);
}

Label1.Text = fileContents;

我已经实现了NCache(如上所述),以及Memcached。我可以告诉你,微软的Velocity确实是在缓存分区内设置冗余和分区数据的最佳选择(非常酷)。更不用说,它是免费的!


3

正如Eric所写,您可以使用ASP.NET内置的缓存来实现您想要的功能 - 它在Web应用程序的所有会话之间共享。

如果您真的想要(或需要)为多台机器(Web农场)拥有一个公共缓存,则需要一些分布式缓存解决方案,例如AppFabricNCache或类似产品。


2
是的,内置的ASP.NET缓存是在应用程序中所有用户(线程)之间共享的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接