我有一個.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方法隨時添加。
也許我所做的是完全錯誤的,但我已經想到了幾件事情:
- 在數據庫中創建新表,用於存儲正是因爲我有在緩存中。這將由CreateDate和高度索引
- 繼續嘗試優化查詢/數據庫,以便查詢將更快
- 保留WCF服務,但已創建一個新的ExpiryDate字段,並有該記錄到期,這種方式不使用的舊東西不會徘徊。
想法??
你能解釋這個更高層次的目的嗎?即沒有緩存,這應該怎麼做? – 2011-04-28 14:58:52
是什麼阻止您將整個列表存儲爲單個對象?您可以將其重新轉換爲其類型,然後重試。 – 2011-04-28 15:00:14
我認爲這可能是一個有趣的問題,但我與戴夫在一起,最終的結果/目的並不完全清楚。 – 2011-04-28 15:13:58