2009-07-10 92 views
1

有一個項目需要考慮以下要求。亞音速支持緩存

  • 數據閱讀密集型應用。
  • 最多100個併發用戶一次。應用具有很高的流量
  • 雖然數據是巨大的是越來越修飾每天

決定採用易於開發和潛力的亞音速原因在高流量環境中工作只有一次。

雖然幾件事情還沒有發現/解決亞音速3

  • 到工作當中層的類型使用活動記錄,倉庫,LINQ to SQL的
  • 分頁工作/整理存儲過程(原因在顯示10000+行時,它們會提供比內置分頁機制更好的性能,並且可以進行分頁和排序。對吧?)
  • 緩存,對於項目要求很清楚,需要大量使用緩存。但找不到適合亞音速的解決方案。 我是否必須爲它創建單獨的圖層,如果是,那麼一個簡短的示例會很有幫助。

回答

3

我爲亞音速2.x ActiveRecord寫了一個CacheUtil類。它基於某些在舊亞音速論壇上發佈的代碼。 (這是從最後一個論壇被刪除之前刪除的論壇中獲得的,這就是爲什麼軟件論壇應該是永久性的。)下面是一個緩存Find方法的例子。你可以適應ss3。還有插入,fetchall,刪除,清除等。羅布康納裏當時說,緩存是有問題的,它被故意排除在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; 
} 
+0

我已經使用HttpRuntime.Cache與基於SQL Server的緩存。這樣我解決了我對高可用性和高併發性的需求。 這個答案是關閉我已經實現的。 – BigBoss 2011-11-23 15:42:12

1

我在這裏也回答了這個問題Thread-safe cache libraries for .NET。基本上你需要一個CollectionCacheManager - 然後我爲每個類型添加一個頂層,並通過這個單獨的緩存控制器收集所有的請求,而後者又使用1個collectioncachecontroller。在外層,我混合了純亞音速,linq,無論什麼時候符合法案。這是SubSonic的美妙之處,它不應妨礙你的發展。至於存儲過程的表現,我會指向傑夫阿特伍德在CodingHorror的文章,並reevaulaute您的儲蓄。硬件很便宜,因爲內存,數據庫都不是。我個人保持數據庫超級簡單和輕量級,並且更願意讓我的web服務器緩存內存中的所有內容。數據庫服務器可以完成很少的工作,這是我喜歡的方式。增加一些額外的負載平衡Web服務器幾乎不像增加數據庫吞吐量,羣集或分解數據庫那樣重要。 SQL &存儲過程也可能難以編寫和維護。拿出你花在你這段時間的預算,而是加強你的硬件......記住硬件是便宜的,好的開發者不是。祝你好運!

+0

可能是愚蠢的問題,但不是MS緩存應用程序塊是線程安全的。使用建議的緩存管理器比使用這個更有優勢。 – BigBoss 2011-02-01 19:57:52