簡體   English   中英

Web 應用——緩存架構

[英]Web application - cache architecture

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

該服務在 singleton 中保存一個 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 go 使用GetViewBetween (使用CreateDate字段),然后發出 LINQ 查詢以僅返回 AccountIds 匹配的 DatabaseIds。

這加快了數據庫檢索,但隨着記錄數量的增加,memory 的要求也會增加。 我已經對 AppFabric Cache、MemCached 進行了試驗,發現它們無法使用,因為它們將項目存儲在 Key/Value 中。 也許我錯了,但是這些產品可以使用嗎,如果可以,如何使用? 如果不是,我可以使用哪些其他方式來存儲順序數據(按日期)以獲取匹配的 DatabaseId?

更新

我這樣做的原因是直接搜索數據庫相當慢,並且存儲在數據庫中的項目並不總是按時間順序排列。 如果我可以直接傳入DatabaseId,那么數據庫只需要在PK上做一個seek。 它還允許我使用 MemCached 來存儲數據,進一步減少數據庫訪問。 這是更高的目的。 此外,我需要 Web 服務器進行擴展,這就是為什么我將它從 Runtime.Cache 移到外部的原因。

我不是 100% 確定我真的需要這種緩存,但是當我直接查詢數據庫時,即使有正確的索引也會有更大的延遲。 使用這種方法,WCF 搜索在大約 20 毫秒內返回結果(大約有 1,000,000 條記錄),並且 db 查詢會非常快(記不起時間)。 我也很疲倦,隨着使用量開始攀升,這個 WCF 將無法擴展。

另外,我確實考慮過將整個 SortedList 存儲到緩存中,但是轉換到/從/常量添加使它相當慢。

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

也許我所做的是完全錯誤的,但我想到的一些事情是:

  1. 在 Db 中創建一個新表,該表與我在緩存中的存儲完全相同。 這將由 CreateDate 聚集並高度索引
  2. 繼續嘗試優化查詢/數據庫,以便查詢更快
  3. 保留 WCF 服務,但創建一個新的 ExpiryDate 字段,並讓該記錄過期,這樣舊的東西不會被使用。

想法??

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

我提到這一點是因為如果您不喜歡字典樣式的訪問,您可以自定義檢索數據的方式。 我認為在大多數緩存結構中,您會看到相同的字典方法,因此您可能會陷入困境。 您可以考慮使用其他類型的基於高速 object 的持久性,例如 MongoDB 或 Cassandra(適用於 facebook)來提高吞吐量。 幸運的是,您有很多選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM