在C#/ .Net中缓存

Caching in C#/.Net

我想问你在C中实现缓存的最佳方法是什么?是否有可能使用给定的.NET类或类似的类?也许有点像一个字典,它会删除一些条目,如果条目太大,那么垃圾收集器将不会删除哪些条目呢?


如果您使用的是.NET 4或更高版本,则可以使用memorycache类。


如果您使用的是ASP.NET,那么可以使用Cache类(System.Web.Caching类)。

这里有一个好的助手类:c-cache-helper-class

如果您的意思是在Windows窗体应用程序中进行缓存,这取决于您尝试做什么,以及您尝试缓存数据的位置。

对于某些方法,我们在WebService后面实现了一个缓存。(使用System.Web.Caching对象)。

但是,您可能还需要查看缓存应用程序块。(请参见此处)它是.NET Framework 2.0企业库的一部分。


框架中的memory cache是一个很好的开始,但是您也可以考虑使用开源库lazycache,因为它比内存缓存有一个更简单的API,并且内置了锁以及其他一些开发人员友好的功能。Nuget上也有。

举个例子:

1
2
3
4
5
6
7
8
9
10
// Create our cache service using the defaults (Dependency injection ready).
// Uses MemoryCache.Default as default so cache is shared between instances
IAppCache cache = new CachingService();

// Declare (but don't execute) a func/delegate whose result we want to cache
Func<ComplexObjects> complexObjectFactory = () => methodThatTakesTimeOrResources();

// Get our ComplexObjects from the cache, or build them in the factory func
// and cache the results for next time under the given key
ComplexObject cachedResults = cache.GetOrAdd("uniqueKey", complexObjectFactory);

我最近写了一篇关于开始在dot-net中缓存的文章,您可能会发现这很有用。

(免责声明:我是Lazycache的作者)


您可以使用ObjectCache。

请参阅http://msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache.aspx


对于本地商店

  • .NET内存缓存
  • NCache快车
  • AppFabric缓存

.NET提供的缓存类很方便,但有一个主要问题——如果不杀死GC,它们无法长时间存储大量对象数据(数千万以上)。如果您缓存几千个对象,它们会很好地工作,但是当您移动到数百万个对象中并保留它们直到它们传播到gen2时,GC暂停将最终开始变得明显,当您的系统达到低内存阈值时,GC需要扫描所有gen。

实用性是——如果需要存储几十万个实例——使用MS缓存。无论对象是2字段还是25字段,这都无关紧要——这与引用的数量有关。

另一方面,在某些情况下,需要使用目前常见的大型RAM,即64 GB。为此,我们创建了一个100%托管内存管理器和位于其上的缓存。

我们的解决方案可以很容易地将300000000个对象存储在内存中,而不需要对GC征税——这是因为我们将数据存储在大型(250MB)字节的[]段中。

这是代码:nfx pile(apache 2.0)

和视频:NFX堆缓存-YouTube


你的问题需要进一步澄清。C是一种语言,而不是框架。必须指定要实现缓存的框架。如果我们认为您希望在ASP.NET中实现它,那么它仍然完全取决于您希望从缓存中得到什么。您可以在进程内缓存(它将数据保存在应用程序堆中)和进程外缓存(在这种情况下,您可以将数据存储在其他内存中,而不是像Amazon弹性缓存服务器这样的堆中)之间作出决定。还有一个需要做的决定是在客户端缓存或服务端缓存之间。通常在解决方案中,您必须为缓存不同的数据开发不同的解决方案。因为基于四个因素(可访问性、持久性、大小、成本),您必须决定需要哪种解决方案。


如果您要在ASP.NET中缓存某些内容,那么我将查看cache类。例如

1
2
3
Hashtable menuTable = new Hashtable();
menuTable.add("Home","default.aspx");
Cache["menu"] = menuTable;

然后再取回它

1
Hashtable menuTable = (Hashtable)Cache["menu"];


你可以使用哈希表

它的查找速度非常快,没有密钥冲突,并且不会垃圾收集您的数据。