2009-11-24 26 views
12

我試圖緩存價格值使用HttpRuntime.Cache.Insert(),但只有似乎持有值幾個小時或東西清理出來之前。我究竟做錯了什麼?我希望價值在緩存中保留3天。C#HttpRuntime.Cache.Insert()沒有持有緩存值

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), TimeSpan.Zero); 
+0

你如何驗證它是否清除了? –

+0

@ J.W。 :如果條目已被刪除/過期,則Cache [CacheName]將爲空。 – RickNZ

回答

31

簡短回答

您的應用程序池或網站過早關閉。擴展站點上的空閒超時,延長運行站點的池的應用程序池生存期。提高內存分配和請求限制。

完整的答案

如果你想知道什麼時候,爲什麼事情正在從緩存中刪除,您需要使用的插入CacheItemRemovedCallback選項登錄項目拆除......然後你就可以使用日誌的原因CacheItemRemovedReason的說法。因此,您可以登錄的原因爲四個上市原因之一:

  1. 刪除該項目是由一個刪除方法調用或由指定的相同密鑰的插入方法調用緩存中刪除。
  2. 已過期該項目已從緩存中刪除,因爲它已過期。
  3. 未充分利用該項目從緩存中,因爲系統中刪除它以釋放內存中刪除。
  4. DependencyChanged該項目從緩存中刪除,因爲與它相關的緩存依賴改變。

通常情況下,您會發現過期和未充分使用是沒有顯示的事情的原因除去對緩存進行的調用並且沒有依賴關係。

在追蹤這些有趣的東西時,您可能會發現您的物品未被過期或未充分使用。相反,我懷疑你會發現AppDomain正在卸載。

的一種方式會發生這種情況是由於web.config文件(或bin目錄,或的.aspx,等)的文件得到改變。有關何時發生的更多信息,請參閱this page應用程序重新啓動部分。發生這種情況時,當前掛起的請求將被耗盡,緩存清空,並且AppDomain卸載。您可以通過檢查AppDomain.IsFinalizingForUnload並在回撥期間記錄該情況來檢測此情況。

的另一個原因AppDomain的回收是當IIS決定回收程序池任何它已配置的原因。這樣的例子是XXX存儲器已被分配在壽命,YYY秒運行時的程序池的,TTT計劃的回收時間,或IIII空閒時間(無請求進入)。欲知詳情檢查this article for IIS6this article for IIS7

+0

我有這個問題,無法讓iis express停止重新啓動應用程序,奇怪的是這只是mvc項目的一個問題。我升級到完整的iis,問題消失了。 – Jimmy

+1

很好的答案和一個偉大的用戶名! – theycallmemorty

1

檢查App Pool上的回收時間。

4

文檔http://msdn.microsoft.com/en-us/library/4y13wyk9.aspx說如果使用絕對過期,則必須使用Cache.NoSlidingExpiration。

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), Cache.NoSlidingExpiration); 

雖然這可能不是你的問題,但我發現Cache.NoSlidingExpiration應該和TimeSpan.Zero一樣。

接下來,我將檢查您的應用程序池是否過期,並檢查您使用的緩存數量。如果它是一個使用大量內存(即內存緩存)的高流量站點,那麼它將使緩存項目過期,因爲其他內容需要內存。

也檢查最後的評論在這裏http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon有人似乎已經找到了解決您的問題。

+0

這幫助了我一個無關緊要的問題。謝謝! – klkitchens

0

默認情況下,添加到緩存的項目沒有設置過期,所以這肯定是緩存之外的事情。我同意喬希,你應該檢查你的應用程序池的回收時間。

查看此頁面以查看如何添加委託以便讓您準確知道何時從緩存中刪除項目的示例。這可以幫助你排除故障,如果它不是你的應用程序池:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx

〜的md5sum〜

5

緩存對象不保證其將保留緩存對象可言,多的少你建議的全部時間。

如果您希望更強烈地鼓勵它這樣做,則可以在將項目插入緩存時設置CacheItemPriority.High或CacheItemPriority.NotRemovable。使用默認的普通優先級時,運行時會有相當積極的策略,在內存壓力增加時釋放對象。

最重要的是,默認情況下,IIS AppPool將每天大約回收一次,這將清除緩存中的所有內容。