Caching in C#/.Net
我想问你在C中实现缓存的最佳方法是什么?是否有可能使用给定的.NET类或类似的类?也许有点像一个字典,它会删除一些条目,如果条目太大,那么垃圾收集器将不会删除哪些条目呢?
如果您使用的是.NET 4或更高版本,则可以使用memorycache类。
如果您使用的是ASP.NET,那么可以使用
这里有一个好的助手类:c-cache-helper-class
如果您的意思是在Windows窗体应用程序中进行缓存,这取决于您尝试做什么,以及您尝试缓存数据的位置。
对于某些方法,我们在WebService后面实现了一个缓存。(使用
但是,您可能还需要查看缓存应用程序块。(请参见此处)它是.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"]; |
号
你可以使用哈希表
它的查找速度非常快,没有密钥冲突,并且不会垃圾收集您的数据。