2011-04-28 25 views
1

我有一個.Net應用程序和一個WCF服務,我使用SortedSet按時間順序緩存項目。它存儲了一些用於檢索DatabaseId的元數據,因此查詢到Db的速度會更快。我需要最佳/正確/最合適的架構方面的幫助。Web應用程序 - 緩存體系結構

該服務包含一個單例中的SortedSet。存儲的數據是

public class MyData : IComparable<MyData> { 
    DateTime CreateDate {get; set;} 
    List<int> AccountIds {get; set;} 
    long DatabaseId {get; set;} 

    // implementation to sort by CreateDate 
} 

我有有合同

List<int> GetDatabaseIds(DateTime startRange, DateTime endRange, 
    List<int> accountIds) 

然後,此方法將經過SortedSet,使用GetViewBetween(使用CreateDate場)的方法,然後發出LINQ查詢只返回AccountIds匹配的DatabaseIds。

這加快了數據庫檢索速度,但隨着記錄數量的增加,內存需求也會增加。我嘗試過AppFabric Cache,MemCached,並發現它們不可用,因爲它們將項存儲在鍵/值中。也許我錯了,但可以使用這些產品,如果是這樣的話?如果沒有,我還可以使用其他什麼方式來存儲順序數據(按日​​期)以獲得匹配的DatabaseIds?

更新

的原因我爲什麼我這樣做的是通過數據庫搜索,直接是相當緩慢的,並且獲得存儲在數據庫中的項目並不總是按時間順序排列。如果我只能傳入DatabaseId,數據庫只需要在PK上查找。它也允許我使用MemCached來存儲數據,進一步最小化數據庫訪問。這是更高的目的。另外,我需要Web服務器進行擴展,這就是爲什麼我將它從Runtime.Cache移出到外部的原因。

我不是100%確定我確實需要這種緩存,但是當我直接查詢數據庫時,即使正確安裝了索引,也會有更大的延遲。使用這種方法,WCF搜索返回約20ms的結果(大約有1,000,000條記錄),並且數據庫查詢會非常快(無法記住時間)。我也厭倦了,隨着使用量的增加,這個WCF不會擴展。另外,我的確在考慮將整個SortedList存儲到緩存中,但是從/添加/常量添加使得它非常緩慢。

我預計行數至少增加10,000個/天,並且記錄通過另一個WCF方法隨時添加。

也許我所做的是完全錯誤的,但我已經想到了幾件事情:

  1. 在數據庫中創建新表,用於存儲正是因爲我有在緩存中。這將由CreateDate和高度索引
  2. 繼續嘗試優化查詢/數據庫,以便查詢將更快
  3. 保留WCF服務,但已創建一個新的ExpiryDate字段,並有該記錄到期,這種方式不使用的舊東西不會徘徊。

想法??

+0

你能解釋這個更高層次的目的嗎?即沒有緩存,這應該怎麼做? – 2011-04-28 14:58:52

+0

是什麼阻止您將整個列表存儲爲單個對象?您可以將其重新轉換爲其類型,然後重試。 – 2011-04-28 15:00:14

+0

我認爲這可能是一個有趣的問題,但我與戴夫在一起,最終的結果/目的並不完全清楚。 – 2011-04-28 15:13:58

回答

0

你可以使用自定義緩存像我在這裏:http://www.itsalltechnical.com/2011/01/non-web-expiring-generic-cache-in-c.html

我提到這一點,因爲你可以自定義您檢索數據的方式,如果你不喜歡的字典式的訪問。我認爲,在大多數緩存結構中,您會看到相同的字典方法,因此您可能會在此處出現問題。您可以考慮使用其他類型的基於高速對象的持久性,例如MongoDB或Cassandra(適用於Facebook)以獲得吞吐量。幸運的是,你有很多選擇。