2012-04-20 55 views
4

後,我有以下問題,我有這樣的緩存管理:的MemoryCache總是返回「空」第一到期

public class CacheManager : ICacheManager { 

    private readonly ObjectCache cache; 

    public CacheManager() { 
     this.cache = MemoryCache.Default; 
    } 

    public void AddItem(string key, object itemToCache, double duration) { 
     var end = DateTime.Now.AddSeconds(duration); 
     this.cache.Add(key, itemToCache, end); 
    } 

    public T Get<T>(string key) where T : class { 
     try { 
      return (T)this.cache[key]; 
     } 
     catch (Exception ex) { 
      return null; 
     } 
    } 

    public void Remove(string key) { 
     this.cache.Remove(key); 
    } 
} 

是相當簡單的。

編輯我(在這個問題的文本錯誤修復)

問題:當任意鍵緩存過期,下面所有的調用獲取緩存回報「空」的對象。我檢查鑰匙,並始終正確。

這個問題只發生在我的電腦中客戶端的服務器上,而我的服務器工作正常。

感謝。

編輯II(進步)

當我們重新啓動應用程序池在客戶的服務器,你的問題就解決了幾個小時。

有一個特定的應用程序池我們的網站具有以下設置:

管道管理模式:集成 框架:V4.0 啓用32位應用程序:真。

其他設置,如默認。

在服務器上我們有2個站點,其中一個啓用了「啓用32位應用程序」,如果兩者都禁用,則發生錯誤,但不知道是否是問題所在。

編輯III(進步)

我們不能解決這個問題,我們決定改用Httpcontext.Current.Cache,我們可以解決這個問題。我們想要另一個解決方案並繼續使用MemoryCache但沒有結果。

+0

是什麼 – 2012-04-20 23:15:16

+2

也許你應該重新考慮吞嚥所有異常並返回null。改用TryGetvalue。如果添加緩存的目的是爲了增加性能,那麼異常就不是要走的路。 – usr 2012-04-20 23:18:43

+0

@RobertHarvey:谷歌搜索「exirar和諮詢」產生這篇文章作爲第一個結果:) – mellamokb 2012-04-20 23:19:56

回答

1

復活一個老問題,但我相信這個問題是由於一個僅在ASP.NET 4.5中修復的錯誤,但它有一個早期版本的修復程序。

看到這個主題: 「exirar和協商」 MemoryCache Empty : Returns null after being set

1

這種緩存通常需要你的代碼的形式爲「如果一個項目不在緩存中,然後創建該項目,使用創建的項目並添加到緩存中,否則使用緩存中的項目」。所以通常它應該是一個問題,如果一個項目不在緩存中。

項目從緩存中消失的常見原因是內存使用率過高。在這種情況下,內存緩存可能會立即驅逐物品,只要它們添加到緩存中。對於在32位(x86)中運行的應用程序,這種行爲非常常見,特別是在處理大量請求或大量數據的服務器上。

驗證 - 收集內存流量並處理流量。考慮使用MemoryCache.CreateCacheEntryChangeMonitor和相應事件添加代碼以偵聽緩存中的項目。

+0

謝謝,我服了一個回覆前進,但我無法解決。我編輯我的問題與進展。 – 2012-04-24 13:01:32