【问题标题】:caching common lookup data - strategies缓存通用查找数据 - 策略
【发布时间】:2009-01-16 06:08:57
【问题描述】:

着眼于在 asp.net Web 应用程序中为一些常见的查找数据实现缓存。

在过去,我创建了一个单例,它创建了一堆具有公共访问器的哈希表。这对于永不更改的只读数据非常有效。

我已经对 System.Web.Caching 进行了一些研究,但它似乎并没有比单例方法提供任何好处。我们没有使用 SQLServer,因此在数据可能发生变化的极少数情况下,我们将无法利用 SQLCacheDependency。

有人对这两种方法都有经验吗?或者有更好的建议?

【问题讨论】:

    标签: asp.net caching


    【解决方案1】:

    System.Web.Caching 的一个好处是内存存储在应用程序池中。这很方便,因为在应用程序池上setup memory/processing limits 非常容易。

    我在对应用程序进行压力测试时遇到了这个问题(每个用户任务都需要昂贵的计算)。随着我们添加越来越多的用户,缓存占用了所有可用内存。一旦我们在应用程序池上设置了内存限制,一切都会自行解决。 Cache 有LRU algorithms 来管理内存。

    我不知道你缓存中的数据是否依赖于负载,但如果是,这是一个方便的好处。

    【讨论】:

    • 单例对象使用的内存也存储在应用程序池中。
    【解决方案2】:

    我无法谈论 System.Web.Caching 的好处,因为和您一样,我通常实现了查找表数据结构的单例实例。单例类还公开了一个 InvalidateCache() 方法来处理数据可能更改的罕见情况。

    如果您正在构建用于 asp.net 和例如 winforms 的业务对象库,那么您可能会决定避免使用 System.Web.Caching。

    我使用的业务对象框架为名为 NameValueListBase 的查找表提供了一个基类。这个通用基类提供了强类型的辅助方法。您可以开发一个类似的基类并公开您自己的辅助方法,而不仅仅是公开 System.Collections.Generic.Dictionary 的实例。

    我提到的业务对象框架称为CSLA.Net,在Expert C# 2008 Business Objects 中有详细说明。该书还有一个可用于 VB.Net 的版本。

    【讨论】:

      【解决方案3】:

      我对两者都有经验。我更喜欢单例模式,原因如下:

      1. 它不绑定到 asp.net
      2. 它允许您使用业务层中的查找来进行验证或其他任何操作。
      3. 如果查找变得更复杂并且您决定不缓存它,重构会更容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-08
        • 2010-10-06
        • 1970-01-01
        • 2016-01-07
        • 2012-09-05
        • 2020-08-03
        • 2011-11-12
        • 2011-01-18
        相关资源
        最近更新 更多