我想在ASP.NET应用程序中缓存自定义数据。我将大量数据放入其中,例如List< objects>和其他对象。
这是最好的做法吗?因为如果我使用静态数据,如果w3p.exe
死亡或被回收,则需要再次填充缓存。
数据库也会被其他应用程序更新,因此需要一个线程来确保它在最新数据上。
刚刚找到这个,这可能对我有帮助
我使用DotNetNuke作为应用程序,(:()。我启用了持久性缓存,现在整个应用程序都感觉很糟糕。
例如Multiview需要大约3秒来交换视图....
Strategies for Caching on the Web?
与此相关,我使用的是DotNetNuke缓存方法,后者又使用ASP.NET Cache
对象,它还具有基于文件的缓存。
我有一个帮手:
CachingProvider.Instance().Add( _
(label & "|") + key, _
newObject, _
Nothing, _
Cache.NoAbsoluteExpiration, _
Cache.NoSlidingExpiration, _
CacheItemPriority.NotRemovable, _
Nothing)
哪个运行将对象添加到缓存中,这是正确的吗?因为我想尽可能长时间地缓存它。我有一个每x分钟运行一次的线程,它将更新缓存。但我已经注意到,缓存正在清空,我检查缓存中的对象“CacheFilled”。
作为测试我告诉工人流程不要回收等,但似乎仍然清除了缓存。我还将DotNetNuke设置从“重”改为“轻”,但认为是模块缓存。
答案 0 :(得分:2)
另请参阅MS Enterprise Caching Application块,它允许您编写自定义过期策略,自定义存储等。 http://msdn.microsoft.com/en-us/library/cc309502.aspx
您也可以查看“速度” http://code.msdn.microsoft.com/velocity
如果您希望跨服务器扩展应用程序,这将非常有用......
答案 1 :(得分:2)
您正在寻找基于您的要求的进程外缓存或某种分布式缓存系统。我建议使用分布式缓存,因为它具有很高的可扩展性,专用于缓存。其他人推荐了Velocity,我们一直在评估和充分享受。我们编写了几个缓存提供程序,我们可以在评估不同的分布式缓存系统时进行交换,而无需重建。当我们作为最终评估的一部分对各种系统进行负载测试时,这将派上用场。
过去,我们的遗留应用程序是随机分类的缓存项目。有DataTables,DataViews,Hashtables,Arrays等,并且在任何给定时间都没有使用的逻辑。我们已经开始转向缓存我们的域对象(即POCO)集合。使用泛型集合很不错,因为我们知道所有内容都以相同的方式存储。在它们上运行LINQ操作非常简单,如果我们需要存储专门的“视图”,系统就足够高效,可以存储特定的对象集合。
我们还设置了一个抽象层,几乎可以在DAL或缓存模型之间调用。通过此层调用将检查缓存未命中或缓存命中。如果有命中,它将从缓存返回。如果有未命中,并且应该缓存调用,它将在检索数据后尝试缓存数据。该系统的直接好处是,如果专用于缓存的计算机出现硬件或软件故障,我们仍然可以从数据库中检索数据而不会出现真正的中断。当然,在这种情况下,网站的执行速度会慢一些。
关于分布式缓存系统,另一件需要考虑的事情是,由于它们不在进程中,因此您可以让多个应用程序使用相同的缓存。这里有一些有趣的可能性,涉及在应用程序之间共享数据库,实时操作数据等等。
答案 2 :(得分:1)
有很多关于ASP.NET中的Cache对象的文章,以及如何使它使用SqlDependencies和其他类型的缓存过期。无需自己编写。建议在会话或人们用来填充大量数据的任何其他集合中使用缓存。
答案 3 :(得分:1)
缓存和会话可以导致行为迟缓,但有时它们是正确的解决方案:正确工作的正确工具规则适用。
我个人经常在伪静态单例中为你描述的那种角色创建集合(通常是为了避免像存储已编译的xslttransform那样的I / O开销),但是要记住那种缓存是非常重要的。是脆弱的,并为它设计A)。 filewatch或以其他方式监视它应该在适当的地方缓存的内容和B)。使用时重新创建/填充自己 - 它应该经常被刷新。
基本上我推荐它作为性能拐杖,但不要依赖于任何需要真正持久性的东西。