2013-06-24 105 views
3

我有我存儲在asp.net緩存中的產品列表,但是在刷新緩存時遇到問題。根據我們的要求,我想每15分鐘刷新一次緩存,但是我想知道,如果在緩存刷新的同時,如果某個用戶請求產品列表,那麼他應該得到錯誤還是舊列表,或者他有等待緩存刷新。管理asp.net中的緩存對象

示例代碼如下

public class Product 
{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
} 

我們有一個功能,這使我們的產品列表中BLL

public List<Product> Products() 
{ 
     //////some code 
} 

Cache.Insert("Products", Products(), null, DateTime.Now.AddMinutes(15), TimeSpan.Zero); 

我想在這裏多加一個局面,讓說,我用靜態對象而不是緩存對象,那麼會發生什麼,以及哪種方法最好,如果我們在一個獨立的服務器上,而不是羣集上

+2

無論哪種方式,它取決於將檢索您的數據的代碼。 15分鐘後,緩存將簡單地爲「產品」關鍵字返回null。靜態對象將無法在應用程序池回收中生存,所以在這種情況下,它也將依賴於將從靜態對象中檢索數據的代碼。 –

+0

此外,您還需要在兩種情況下都使用線程安全集合。請參閱[System.Collections.Concurrent命名空間](http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx) – Magnus

+0

你可以給我鏈接到這個東西實現的例子 – rajansoft1

回答

3

對不起 - 這可能是天真的/明顯的,但只是有一個門面型類確實

if(Cache["Products"] == null) 
{ 
     Cache.Insert("Products", Products(), null, DateTime.Now.AddMinutes(15), TimeSpan.Zero); 
} 
return Cache["Products"]; 

還有一個CacheItemRemoveCallback委託,你可以用它來重新填充過期的緩存。作爲替代

還有

使用緩存對象而不是靜態對象。更高效的明顯(Asp.net - Caching vs Static Variable for storing a Dictionary),你會得到你所有的緩存管理方法(滑動過期等)

編輯

如果有那麼一個關於更新時間關注考慮兩個緩存對象加控制器例如

  1. 活動緩存
  2. 備份緩存 - 這是將要更新
  3. 緩存控制器的一個,這將表明哪些對象是活動

所以過程(另一個緩存對象?)更新將

  1. 更新備份緩存
  2. 有限公司mpletes。檢查有效
  3. 備份變爲活動狀態,反之亦然。該控件現在將備份緩存標記爲處於活動狀態

需要有一種方法在產品緩存對象填充時觸發。我可能會使用CacheItemRemoveCallback委託啓動緩存重新填充。還是在門面型類的異步調用 - 你不希望它阻止當前線程

我敢肯定有這個

EDIT 2

的許多其他變體其實思考關於這我會讓控制器類是這樣的

public class CacheController 
{ 
    public StateEnum Cache1State {get;set;} 
    public StateEnum Cache1State {get;set;} 
    public bool IsUpdating {get;set;} 
} 

該狀態將是積極的,備份,更新,也許無效和錯誤。您可以在發生更新時設置IsUpdating標誌,並在完成時返回false以停止嘗試一次更新的多個線程 - 即競爭條件。該類只是一個普遍的原則,可以/應該根據需要進行修改。

+0

高速緩存刷新的時間如何? – rajansoft1

+3

競爭條件意味着您有可能(儘管可能不太可能)將緩存項目從「Cache.Insert(key,...)」和「return Cache [key]」之間驅逐出去。使用一個局部變量來保證你不會返回null。 – Joe

+0

謝謝你 - 使用回調委託或使用備份緩存方法會是真的嗎?這只是第一個(只有?!?)代碼示例中的問題嗎? –