【问题标题】:Custom caching in ASP.NETASP.NET 中的自定义缓存
【发布时间】:2010-08-30 03:24:56
【问题描述】:

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

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

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

更新 1:

刚找到这个,可能对我有帮助

http://www.codeproject.com/KB/web-cache/cachemanagementinaspnet.aspx?fid=229034&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2818135#xx2818135xx

更新 2:

我使用 DotNetNuke 作为应用程序,( :( )。我启用了持久缓存,现在整个应用程序感觉迟缓。

比如一个Multiview需要大约3秒来交换视图....

更新 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 设置从“重”更改为“轻”,但我认为这是为了模块缓存。

【问题讨论】:

    标签: asp.net caching


    【解决方案1】:

    根据您的要求,您正在寻找进程外缓存或某种分布式缓存系统。我推荐分布式缓存,因为它具有很强的可扩展性并且专用于缓存。其他人推荐了 Velocity,我们一直在评估并彻底享受它。我们编写了几个缓存提供程序,我们可以在评估不同的分布式缓存系统时互换它们,而无需重新构建。当我们在最终评估中对各种系统进行负载测试时,这将派上用场。

    过去,我们的旧应用程序一直是随机分类的缓存项目。有 DataTables、DataViews、Hashtables、Arrays 等,在任何给定时间使用什么都没有逻辑。我们已经开始转向只缓存我们的域对象(即 POCO)集合。使用泛型集合很好,因为我们知道一切都以相同的方式存储。在它们上运行 LINQ 操作非常简单,如果我们需要存储一个专门的“视图”,系统足够高效,可以存储特定的对象集合。

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

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

    【讨论】:

      【解决方案2】:

      还可以查看 MS 企业缓存应用程序块,它允许您编写自定义过期策略、自定义存储等。 http://msdn.microsoft.com/en-us/library/cc309502.aspx

      您还可以查看“速度”,可在 http://code.msdn.microsoft.com/velocity

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          基本上我推荐它作为性能的拐杖,但不要依赖它来做任何需要真正持久性的事情。

          【讨论】:

            猜你喜欢
            • 2018-04-21
            • 2012-08-25
            • 1970-01-01
            • 2014-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-15
            • 1970-01-01
            相关资源
            最近更新 更多