我正在將一個Web應用程序部署到IIS,我的應用程序使用靜態字典,這是經常從外部api填充的。iis回收是否清理內存?
有時我觀察到詞典正在被清除一次&我懷疑這是因爲IIS自動回收。
任何人都可以請確認這可能是一個原因嗎? 所以基本上我的問題是IIS回收會清理Web應用程序使用的靜態內存? (雖然我知道,當有與服務器的任何活動連接,這隻會發生)
我正在將一個Web應用程序部署到IIS,我的應用程序使用靜態字典,這是經常從外部api填充的。iis回收是否清理內存?
有時我觀察到詞典正在被清除一次&我懷疑這是因爲IIS自動回收。
任何人都可以請確認這可能是一個原因嗎? 所以基本上我的問題是IIS回收會清理Web應用程序使用的靜態內存? (雖然我知道,當有與服務器的任何活動連接,這隻會發生)
如果你看看這個MS文章:https://technet.microsoft.com/pl-pl/library/cc753179(v=ws.10).aspx
除了發生問題時回收一個應用程序池按需,您可以配置一個應用程序池回收工作進程,原因如下: 在預定的時間
經過時間後
達到數量要求
的達到虛擬內存閾值
達到使用內存閾值
後後後,所以,如果IIS回收不會清理內存回收它在內存門檻上是沒有意義的。此外,IIS回收會導致應用程序重新啓動,因此它顯然也會清除它的內存。
是的,默認情況下,IIS通過調用垃圾回收器每20分鐘清空內存來回收您的應用程序池。
您可以在應用程序池中看到空閒超時設置 - >高級設置,但最好不要更改它。
所有靜態的東西都是「壞」不要使用它們,你的選擇是緩存。您可以製作一個通用緩存服務,該服務使用默認的MVC緩存並使線程安全。
您還可以使用子動作控制器上的[OutputCache]屬性並設置分鐘。在此間隔之間數據將被緩存
或者您可以實現自己的緩存邏輯。
從所有三件事我會建議你第一個使用默認的MVC緩存。我將爲您提供一個樣本實現得益於#TelerikAcademy和#NikolayKostov
namespace Eshop.Services.Common
{
using System;
using System.Web;
using System.Web.Caching;
using Contracts;
public class HttpCacheService : IHttpCacheService
{
private static readonly object LockObject = new object();
public T Get<T>(string itemName, Func<T> getDataFunc, int durationInSeconds)
{
if (HttpRuntime.Cache[itemName] == null)
{
lock (LockObject)
{
if (HttpRuntime.Cache[itemName] == null)
{
var data = getDataFunc();
HttpRuntime.Cache.Insert(
itemName,
data,
null,
DateTime.Now.AddSeconds(durationInSeconds),
Cache.NoSlidingExpiration);
}
}
}
return (T)HttpRuntime.Cache[itemName];
}
public void Remove(string itemName)
{
HttpRuntime.Cache.Remove(itemName);
}
}
}
它的用法是用匿名函數和時間間隔
您可以將其設置爲一個受保護的超級簡單基本控制器的屬性,並在您使用的每個控制器中繼承BaseController。比你將不得不在每個控制器緩存服務,你可以簡單地使用它的方式
var newestPosts = this.Cache.Get(
"newestPosts",
() => this.articlesService.GetNewestPosts(16).To<ArticleViewModel().ToList(),
GlobalConstants.DefaultCacheTime);
讓我們假設GlobalConstants.DefaultCacheTime = 10
希望這個答案對你有用。 :)