【问题标题】:subsonic with support for caching支持缓存的亚音速
【发布时间】:2009-07-10 20:43:05
【问题描述】:

考虑到以下要求的项目。

  • 数据读取密集型应用程序。
  • 一次最多 100 个并发用户。应用程序的流量非常高
  • 虽然数据量很大,但每天只修改一次

决定使用亚音速的原因是易于开发和在高流量环境中工作的潜力。

尽管尚未找到/解决与 SubSonic 3 配合使用的一些问题

  • 使用 Active Records、Repository、Linq To SQL 的层类型
  • 使用分页/排序存储过程(因为当显示 10000 多行分页和排序时,它们将提供比内置分页机制更好的性能。对吗??)
  • 缓存,项目需求很明确,需要大量使用缓存。但找不到适合亚音速的解决方案。 我是否必须为其创建单独的图层,如果是,一个简短的示例会有所帮助。

【问题讨论】:

    标签: caching subsonic subsonic3


    【解决方案1】:

    我为 subsonic 2.x ActiveRecord 编写了一个 CacheUtil 类。它基于某人在旧亚音速论坛上发布的一些代码。 (这来自一个在上一个论坛被删除之前被删除的论坛。这就是为什么软件论坛应该是永久的。)这里是一个缓存查找方法的例子。您可以将其调整为 ss3。还有inserts、fetchall、delete、clear等。Rob Connery当时说缓存有问题,故意把它排除在ss2之外。通过使用 HttpRuntime.Cache,我同时在 Web 应用程序和服务之间共享缓存。我相信我可以做到这一点,因为它是一个小型应用程序,始终在单个服务器上。

    public static RecordBase<T> Find<T, ListType>(object primaryKeyValue)
        where T: RecordBase<T>, new()
        where ListType: AbstractList<T, ListType>, new()
    {
        string key = typeof(T).ToString();
        if(HttpRuntime.Cache[key] == null)
            FetchAll<T, ListType>();
        if(HttpRuntime.Cache[key] != null)
        {
            ListType collection = (ListType)HttpRuntime.Cache[key];
            foreach(T item in collection)
            {
                if(item.GetPrimaryKeyValue().Equals(primaryKeyValue))
                    return item;
            }
        }
        return null;
    }
    

    【讨论】:

    • 我已将 HttpRuntime.Cache 与基于 SQL Server 的缓存一起使用。这样就解决了我对高可用性和高并发的要求。这个答案结束了我已经实施的内容。
    【解决方案2】:

    wrote a post about how I used caching with SubSonic 2.x。它与 3.x 不是 100% 兼容,但概念是相同的。

    【讨论】:

      【解决方案3】:

      我在这里Thread-safe cache libraries for .NET 的回答类似。基本上你需要一个 CollectionCacheManager - 然后我在每个类型的顶部添加一个层,并通过这个单独的缓存控制器汇集所有请求,这些控制器又使用 1 个 collectioncachecontroller。在外层,我混合了纯亚音速、linq 以及当时符合要求的任何内容。 SubSonic 的美妙之处在于它不应该妨碍您。至于存储过程的性能,我会在 CodingHorror 上指出 Jeff Atwoods 的文章并重新评估您的储蓄。硬件非常便宜,内存也是如此,数据库则不然。就个人而言,我保持数据库超级简单和轻量级,并且更喜欢让我的网络服务器将所有内容缓存在内存中。数据库服务器做的工作很少,这是我喜欢的方式。添加一些额外的负载平衡 Web 服务器并不像增加数据库吞吐量、集群或分片数据库那么重要。 SQL 和存储过程也很难编写和维护。把你花在做这件事上的预算拿出来,而不是加强你的硬件......记住硬件非常便宜,优秀的开发人员不是。祝你好运!

      【讨论】:

      • 可能是个愚蠢的问题,但 MS 缓存应用程序块不是线程安全的。与此相比,使用建议的缓存管理器有什么优势。
      • MS 缓存块明确指出使用场景是用于很少更改的数据:msdn.microsoft.com/en-us/library/ff650180.aspx。对于 RIA 来说,这通常不是这种情况,而且我需要一些更适合使用 Guid 的东西,这是一个可以很好地与 SubSonic 配合使用的主键。缓存块很好,非常有用,但不能解决集合缓存问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多