2009-09-14 61 views
3

儘管我已經指定了一個唯一的鍵,但似乎下面的代碼將爲5個請求返回一個值,然後再爲另一個返回另一個值,然後恢復到原始請求中保存的值並繼續,直到有10個不同的值對象全部存儲在相同的密鑰下。 它似乎幾乎隨機哪些值將從緩存中返回。Httpruntime緩存鍵不是唯一的嗎?

string strDateTime = string.Empty; 
string cachename = "datetimeexample"; 
object cachedobject = HttpRuntime.Cache.Get(cachename); 
if (cachedobject != null) 
    strDateTime = (string)cachedobject; 
else 
{ 
    strDateTime = DateTime.Now.ToString(); 
    HttpRuntime.Cache.Insert(cachename, strDateTime, null, DateTime.MaxValue, TimeSpan.FromDays(10), CacheItemPriority.NotRemovable, null); 
} 
Response.Write(strDateTime +"  keys:"+ HttpRuntime.Cache.Count); 

非常困惑,這是因爲線程還是什麼?

+0

你確定它存儲多個對象具有相同的密鑰?也就是說,你確定鑰匙*完全相同嗎?如果鍵已經存在,'Insert'方法應該覆蓋現有的對象。 – LukeH 2009-09-14 12:04:03

+0

是的,關鍵是完全一樣的,代碼片斷包裝在靜態方法/類中的圖像。 – maxp 2009-09-14 12:46:52

+0

您正在單臺機器或服務器場上運行嗎? – LukeH 2009-09-15 10:06:18

回答

2

忽略服務器場和負載平衡的可能性,此行爲可能是由作爲web-garden運行的應用程序池導致的。若要從MSDN引用的相關章節:

因爲Web園能夠使用 多個進程,每個進程將 有它自己的應用程序副本 狀態,進程中的會話狀態, 緩存和靜態數據。網絡花園 不應該用於所有 應用程序,特別是如果它們需要 來維護狀態。在確定 網絡花園模式是否合適之前,請務必以 爲基準測試 應用程序的性能。

這將導致它看起來好像緩存爲同一個鍵存儲多個值,在高速緩存中有效地存在重複條目。

要在IIS 7中解決這個問題,打開應用程序池的高級設置並設置最大工作進程 1。對於IIS 6,請參閱MSDN article(漂亮的截圖)。

儘管晚了8個月,我回答了這個問題,因爲我發現它很久之前我發現了this decent article on web-garden gotchas。希望這個答案能夠爲未來的搜索者節省大量的時間。 :)

0

您的快捷鍵始終是'datetimeexample',因此,您將始終有一個對象在緩存中;你會一直收到那個對象。

我不太清楚你在這裏試圖完成什麼,就我而言,它的行爲完全和它應該做的一樣。

+0

我想檢索最初緩存在第一頁請求中的對象,在隨後的請求中。 – maxp 2009-09-14 11:53:50

+0

我無法重現您的問題,因爲這看起來非常好。猜猜這應該是你的IIS設置中的東西。 – 2009-09-14 11:56:06

+0

因此,您的應用程序將只添加x1鍵並不斷檢索相同的鍵? – maxp 2009-09-14 11:57:15

相關問題