ASP.NET中的自定义缓存

ASP.NET中的自定义缓存,asp.net,caching,Asp.net,Caching,我想在ASP.NET应用程序中缓存自定义数据。我将大量数据放入其中,例如列表和其他对象 这方面有最佳实践吗?因为如果我使用静态数据,如果w3p.exe死亡或被回收,缓存将需要再次填充 数据库也会被其他应用程序更新,因此需要一个线程来确保它是最新的数据 更新1: 刚找到这个,可能对我有帮助 更新2: 我正在使用DotNetNuke作为应用程序,(:()。我已经启用了持久缓存,现在整个应用程序感觉很慢 例如,多视图交换视图大约需要3秒钟 更新3: 与此相关,我使用的是DotNetNuke缓存方法

我想在ASP.NET应用程序中缓存自定义数据。我将大量数据放入其中,例如列表和其他对象

这方面有最佳实践吗?因为如果我使用静态数据,如果
w3p.exe
死亡或被回收,缓存将需要再次填充

数据库也会被其他应用程序更新,因此需要一个线程来确保它是最新的数据

更新1: 刚找到这个,可能对我有帮助

更新2: 我正在使用DotNetNuke作为应用程序,(:()。我已经启用了持久缓存,现在整个应用程序感觉很慢

例如,多视图交换视图大约需要3秒钟

更新3:

与此相关,我使用的是DotNetNuke缓存方法,它反过来使用ASP.NET
Cache
对象,它也有基于文件的缓存

我有一个助手:

CachingProvider.Instance().Add( _
    (label & "|") + key, _
    newObject, _
    Nothing, _
    Cache.NoAbsoluteExpiration, _
    Cache.NoSlidingExpiration, _
    CacheItemPriority.NotRemovable, _
    Nothing)
运行该线程以将对象添加到缓存中,对吗?因为我希望尽可能长时间地将其缓存。我有一个每x分钟运行一次的线程,该线程将更新缓存。但是我注意到,缓存正在清空,我检查缓存中是否有对象“CacheFilled”


作为一个测试,我告诉工作进程不要回收等等,但它似乎仍然清除了缓存。我还将DotNetNuke设置从“重”更改为“轻”但请认为这是用于模块缓存。

还可以查看MS Enterprise caching应用程序块,它允许您编写自定义过期策略、自定义存储等。

您还可以检查“速度”,该选项可在


如果您希望跨服务器扩展应用程序,这将非常有用。

关于ASP.NET中的缓存对象以及如何使其使用SqlDependencies和其他类型的缓存过期,有很多文章。无需编写自己的缓存。建议在会话或其他用于填充的集合中使用缓存大量数据进入。

缓存和会话可能导致行为迟缓,但有时它们是正确的解决方案:适用于正确作业的正确工具规则

就我个人而言,我经常为您描述的角色创建伪静态单例集合(通常是为了避免I/O开销,如存储编译后的xslttransform),但必须记住,这种缓存是脆弱的,并且在一定程度上是为它而设计的。filewatch或以其他方式监视它应该在适当的位置缓存的内容(B)。使用use重新创建/填充自身-它应该经常刷新


本质上,我建议将其作为性能支柱,但对于任何需要真正持久性的东西,都不要依赖它。

您正在根据自己的需求寻找进程外缓存或某种分布式缓存系统。我建议使用分布式缓存,因为它具有很强的可伸缩性,并且专门用于缓存。其他人推荐了Velocity,我们一直在评估它,并且非常喜欢它。我们已经编写了几个缓存提供程序,可以在评估不同的分布式缓存系统时进行交换,而无需重建。作为最终评估的一部分,当我们对各种系统进行负载测试时,这将非常有用

在过去,我们的遗留应用程序是缓存项的随机组合。有数据表、数据视图、哈希表、数组等,在任何给定的时间都没有使用什么逻辑。我们已经开始转向缓存我们的域对象(即POCO)集合。使用泛型集合很好,因为我们知道所有内容都是以相同的方式存储的。在它们上运行LINQ操作非常简单,如果我们需要存储一个专门的“视图”,那么系统的效率足以让我们存储特定的对象集合

我们还设置了一个抽象层,代理在DAL或缓存模型之间调用它。通过该层的调用将检查缓存未命中或缓存命中。如果有命中,它将从缓存返回。如果未命中,并且应该缓存调用,则在检索数据后将尝试缓存数据。该系统的直接好处是,如果专用于缓存的机器出现硬件或软件故障,我们仍然能够从数据库中检索数据,而不会出现真正的中断。当然,在这种情况下,站点的运行速度会变慢

关于分布式缓存系统的另一件事是,因为它们不在进程中,所以可以有多个应用程序使用相同的缓存。这里有一些有趣的可能性,包括在应用程序之间共享数据库、实时操作数据等