我使用Http.Current.Cache來存儲從我的數據庫檢索的各種值,因爲我的應用程序是數據密集型的。當我在VS2017安裝的新筆記本電腦上運行我的網站時(在VS2015的另一臺筆記本電腦上我從來沒有看到這個問題),我看到一個非常奇怪的問題,即緩存值似乎被隨機清除 - 幾乎是以一種違背邏輯的方式。如何在單線程中使緩存值失效?
例如,我有一個如果子句的條件是所討論的緩存項不爲空。我的代碼肯定是沿着通過這條如果語句的路徑,但稍後調試器顯示緩存項實際上爲空 - 導致我的應用程序失敗。
public static SportSeason GetCurrentSportSeason(string sportCode)
{
SportSeason sportSeason = null;
string key = "Sheets_SportSeason_" + sportCode;
int i = 0;
if (BaseSheet.Settings.EnableCaching && BizObject.Cache[key] != null)
{
i = 1;
sportSeason = (SportSeason)BizObject.Cache[key];
}
else
{
i = 2;
sportSeason = GetSportSeasonFromSportSeasonDetails(SiteProvider.Sheets.GetCurrentSportSeason(sportCode));
BaseSheet.CacheData(key, sportSeason);
}
if(sportSeason == null)
{
int j = i;
}
return sportSeason;
}
我可以在最終設置斷點,如果並且變量i設置爲1,但sportSeason目的是NULL(因爲是高速緩存條目)。當代碼可能已經進入第一個子句時,如果緩存項不爲空,這怎麼可能呢?
這是一個屏幕截圖,顯示了一些在最終if中帶有斷點的監視變量。
這很難追查,因爲它在我的業務對象中隨機發生。有時我必須刷新頁面3到4次,才能看到這些問題。
如何快速使緩存失效,以及通過什麼?屏幕截圖顯示緩存項目不多,所以我認爲我的內存不足。並沒有其他進程正在運行,可能會破壞緩存。
編輯:通過更多的調試,我已經確定,只有在第91行檢查的緩存鍵被清除(設置爲空),當它再次檢查斷點時。所有其他緩存記錄仍然存在。
EDIT2:我已經分離出的問題到這一點,但它似乎仍然違反邏輯:
HttpContext.Current.Cache.Insert("ABC", "123", null, DateTime.Now.AddSeconds(600), TimeSpan.Zero);
int i = 0;
清除我的所有緩存。當我跨越Cache.Insert語句時,我的緩存計數將變爲1.但是,根據該密鑰的緩存項仍爲空(請參閱監視窗口)。
另外,如果我執行一個以上的語句(包括int i = 0),緩存計數回零。
EDIT3:這是殺害我插入()的則absoluteExpiration參數。不知怎的,一個時鐘關閉。
如果我將AbsoluteExpiration設置爲未來5小時(300分鐘),則不起作用。如果將其設置爲未來5小時1分鐘(301分鐘),則一切正常。
HttpContext.Current.Cache.Insert("ABC", "123", null, DateTime.Now.AddMinutes(301), TimeSpan.Zero);
我的筆記本電腦上的時鐘是100%準確的,你可以看到Intellisense顯示正確的時間。緩存可以基於5小時關閉的其他時鐘嗎?
Edit4:看起來像someone else is off by 5 hours。
在您定義的過程中,你有沒有試圖挽救了'偶然web.config'/ – Webruster
@Webruster沒有,什麼也沒有被除了頁面加載完成 – bperniciaro
可您發佈的頁面加載代碼/ – Webruster