2011-04-07 36 views
1

Iam尋找適合我們的.net Web服務的某種查詢緩存的合適數據結構,該服務獲取xml作爲查詢並返回xml作爲結果。查詢緩存的哪個數據結構?

的流程如下:用戶給出了一個查詢串(〜2kb的尺寸),並得到一個結果(〜50KB的大小)。最後n個查詢及其相應的結果被緩存,所以我們需要一個O(1)查詢查詢 - >結果。如果緩存已滿(cache_size = n),則應從緩存中刪除最早的項目。

所以在最後我需要一個數據結構,作品大多像一個隊列(排隊和出隊在O(1)),而且還支持O(1)查找像一本字典的項目。

我的第一個想法是使用從查詢映射到結果的字典。爲了跟蹤項目的順序,我將使用一個也包含查詢的隊列。但問題是,我會浪費內存,並且將使所有這些長查詢字符串的查找變得更慢。我可以使用另一個字典將查詢映射到創建的唯一ID值,以便查詢字符串僅包含在一個集合中。

是不是有這個恕我直言,簡單的任務更簡單,更高效的解決方案?

+0

我不認爲你的解決方案會浪費太多的內存(無論查詢字符串的大小),因爲隊列只能持有一個引用(3​​2位)到查詢字符串。 – 2011-04-07 09:54:11

回答

1

對於一個簡單的緩存OrderedDictionary類可能會做。對於更大的系統,您可能需要考慮像memcached這樣的全面緩存解決方案。

+0

任何想法,如果有序的詞典讓你更新訂單?如果發生緩存命中,將密鑰移動到「隊列後面」會很好。 – 2011-04-07 09:55:20

+0

刪除並重新添加密鑰,這應該做竅門 – codymanix 2011-04-07 10:03:03

+0

我剛纔看到這個類不是通用的。爲什麼沒有通用版本? – codymanix 2011-04-07 11:01:33

1

我會建議使用現有HttpContext.Cache屬性 - http://msdn.microsoft.com/en-us/library/system.web.httpcontext.cache.aspx

一個更大的/分佈式系統,查找到的memcached(或memcacheddotnet - http://sourceforge.net/projects/memcacheddotnet/

在自己實現它的條款,建議您封裝的OrderedDictionary<> (http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx) - 添加的項目順序被保留,所以你可以訪問第一個/最後一個並添加到最後。我相信固定大小字典的查找將是O(1)。事情是,它將被限制爲一個單一的AppDomain。

+0

謝謝,但Iam正在尋找一種不涉及第三方庫的解決方案 – codymanix 2011-04-07 09:54:18

+2

'HttpContext.Cache'內置於.NET中,並且專門針對您的問題/問題進行了專門設計 – 2011-04-07 09:55:05

+0

從我的組件I無法訪問HttpContext或任何其他Web對象。 – codymanix 2011-04-07 10:04:15

1

System.Web.Caching支持與基於時間的期滿和最大字節極限的Cache類。但它需要.NET 4。

如果你去大(並有機會獲得運行Linux的東西),我強烈建議redis
我使用redis實現了一個類似的查詢緩存,這是一個完全無痛的過程。