[英]Using cache in ASP.NET
我正在嘗試使用ASP.NET MVC Web應用程序中的緩存來存儲一些很少更新的列表數據。 我將這種數據插入UpdateCache()
方法的緩存中,如下所示:
HttpContext.Current.Cache.Insert("MyApp-Products", products, null, DateTime.Now.AddYears(99), Cache.NoSlidingExpiration);
然后在我的模型中檢索它:
public static List<string> GetProducts()
{
var cachedProducts = HttpContext.Current.Cache["MyApp-Products"];
if (cachedProducts == null)
{
UpdateCache();
cachedProducts = HttpContext.Current.Cache["MyApp-Products"];
}
return ((List<string>)cachedProducts );
}
第一次訪問該頁面時,按預期方式調用UpdateCache()
。 如果刷新,則數據來自緩存,而無需調用UpdateCache()
。 但是,大約15分鍾后,我回到了應用程序,緩存的值消失了。 我的理解是,此緩存是針對每個應用程序而不是會話的,因此我希望它對於我自己或其他用戶仍然存在。
我存儲緩存的方式有問題嗎? 還是我對ASP.NET中的Cache
在Web應用程序中的工作方式不了解?
我的理解是,此緩存是針對每個應用程序而不是會話的,因此我希望它對於我自己或其他用戶仍然存在。
雖然按應用程序緩存,但是ASP.NET不能為您提供任何保證,即使您將某些內容存儲到緩存中也可以在其中找到它。 緩存可能在不同的情況下被驅逐,例如您的服務器開始運行的內存不足等。 您可以訂閱事件並在從緩存中逐出項目時得到通知。 您還可以在緩存項目時定義優先級。 優先級越高,將該項目逐出的機會越小。
另外,由於緩存存儲在Web服務器的內存中(默認情況下),因此您不應忘記IIS隨時可以回收您的應用程序域這一事實。 例如,在一定數量的不活動之后,或者如果它開始在內存不足的情況下運行,或者即使達到一定的CPU閾值使用量,...,存儲在內存中的所有內容(包括緩存)都將簡單地消失為空,並且下一個請求在您的應用程序中將啟動一個新的AppDomain。
但是在任何情況下,請確保在使用之前檢查緩存中是否存在該項目。 永遠不要依賴於以下事實:如果您將某些內容存儲在其中,就會找到它。
所有這些責罵到了真正重要的地步,這是您的代碼非常令人擔憂的事情。 看起來您正在將List<string>
實例存儲到緩存中。 但是由於緩存是針對每個應用程序的,因此List<string>
單個實例可以在應用程序的多個用戶之間共享,當然這可以同時發生。 並且您知道List<T>
不是線程安全的結構。 因此,使用此代碼,您充其量只能得到一個異常,而最糟糕的是,您將得到損壞的數據。 因此,請特別小心要緩存的內容以及如何同步對結構的訪問,尤其是在緩存非線程安全類的情況下。
如果這是在完整的IIS上進行的,則大約每15分鍾發生一次。 請記住檢查空閑超時值。
話雖如此,如果此列表“從不”更改,為什么不將其存儲在靜態數組中。
我可以看到通常在數據庫中存儲數據比在靜態對象中存儲數據更好。 首先,萬一數據確實發生變化,更新數據庫比應用程序容易。
嘗試在緩存對象時顯式設置絕對到期時間:
HttpRuntime.Cache.Insert("MyApp-Products", cachedProducts, null, DateTime.Now.AddDays(20), TimeSpan.Zero );
注意出於性能原因,使用HttpRuntime代替HttpContext ,即使兩者之間的差異很小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.