簡體   English   中英

在ASP.NET中使用緩存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM