2012-06-21 37 views
3

我正在檢索新聞項目的大名單。這個特定場景中的最佳緩存策略

我想利用這個列表的緩存顯而易見的原因(運行一個多餘的查詢不會做)。

我把這個列表綁定到一箇中繼器上,我已經擴展了這個中繼器來啓用分頁(在頁面之間輕拂導致頁面加載並因此再次檢索列表)。

複雜的是,這些新聞項目也可以通過查詢字符串「年」來查詢日期,該查詢字符串僅在按日期查詢新聞項時才存在。

下面是僞代碼爲我到目前爲止(在這裏粘貼實際的代碼會花費太多時間修整了所有,只是添加混亂位):

if(complete news items list are not cached OR querystring["year"] != null) 
{ 
    Int year = queryString["year"] (could be null) 
    Cache.Add(GetNewsItems(year)); 
} 
else 
{ 
    return cached newsItems; 
} 

的問題是,當新聞項目頁面加載(由於分頁控件的回發)查詢字符串的[year]參數仍將填充,因此將重新執行GetNewsItems。另外 - 即使家庭網址(即沒有查詢字符串)然後導航到 - 實際上仍然有一個緩存版本的新聞項目,所以它不會嘗試和檢索它們 - - 但他們可能會在那裏特定年份因此與「全年」搜索無關。

我是否添加新的緩存條目來標記最近一次搜索的結果? 我需要考慮什麼來緩存超時? 如果需要的話,我可以添加一個新的查詢字符串(最好不要) - 這會解決問題嗎?

回答

2

你能得到第一個查詢的完整列表,並緩存它(假設它不是太大)?然後對於任何後續查詢從緩存中獲取數據並查詢它以過濾出您想要的年份。

也許你可以在緩存中的數據存儲在

IDictionary<int, IEnumerable<NewsItem>> 

形式(假設有一年以上的NewsItem),其中的關鍵是一年,所以你可以只檢索單個詞典價值對獲得一年的數據。

或者按照您在示例中所做的操作逐年緩存數據,並實施一種機制,以便每年從緩存中獲取數據(如果存在)。當獲得全部時,您可以從數據存儲中獲取全部數據並單獨緩存,或者實施一些機制來確定緩存中缺少哪些年份,然後獲取這些數據。就我個人而言,我認爲我會緩存所有數據並從緩存中過濾數據,以避免緩存數據過多而堵塞內存。

有用TryGetValue模式從緩存中得到的是這樣的:

private bool TryGetValue<U>(string key, out U value) 
    { 
     object cachedValue = HttpContext.Current.Cache.Get(key); 
     if (cachedValue == null) 
     { 
      value = default(U); 
      return false; 
     } 
     else 
     { 
      try 
      { 
       value = (U)cachedValue; 
       return true; 
      } 
      catch 
      { 
       value = default(U); 
       return false; 
      } 
     } 
    } 
+0

羅賓斑。爲此非常感謝!! –

1

不知道這是否會幫助你的情況,但可以轉發添加到用戶控件,並啓用的OutputCache它,以郵寄無效/ GET PARAMS:

<%@ OutputCache Duration="100" VaryByParam="year" %> 
+0

+1,會考慮這一點,但我想我會選擇Robin的解決方案了。非常感謝。 –