2010-08-13 148 views
1

我有一張存儲歌曲和播放計數器的表格。
下面的代碼:ASP.NET緩存,什麼是最佳做法

//Increse plays counter 
string ip = Request.UserHostAddress; 
if (!string.IsNullOrEmpty(ip)) 
{ 
    if (Cache["plays:" + trackID + ":" + ip] == null) 
    { 
     tracks.IncreasePlaysCounter(trackID); 
     Cache["plays:" + trackID + ":" + ip] = true; 
    } 
} 

我不知道會是怎樣一個更好的做法,許多商店緩存項(像這樣)或存儲一個項目一樣,將包含誰已經聽過這首歌的用戶的ArrayList。有什麼區別嗎?

+0

在會話或跨會話期間?你的訪客也是匿名或註冊的嗎? – Jeroen 2010-08-13 16:34:51

+0

我想我們需要更多的上下文才能更好地回答你的問題。你想達到什麼目的? – ddc0660 2010-08-16 14:05:14

+0

@ ddc0660我有一個包含歌曲的數據庫表,每首歌都有一個播放計數器。我只是想限制這個計數器,所以每次重新加載都不會增加這個計數器。我認爲另一張桌子會很快變大,也許我需要一些「臨時桌子」? – Adir 2010-08-16 20:04:20

回答

2

都沒有。如果你的系統在某種程度上成功了,它將會有太多的單個條目被寫入,以便能夠擴展以應付,特別是當你添加鎖定代碼來處理同時寫入和讀取的次數時,這將必須應對用。

將此信息存儲在數據庫中。或者根本不存儲它,但是通過解析網絡服務器日誌來獲取它(如果trackID是一個查詢參數,這些信息將已經存在於那些沒有任何工作的日誌中)。

+0

我同意Jon Hanna的觀點,您將很快耗盡內存,並且由於內存限制,如果有大量用戶可能會將這些緩存條目從緩存中踢出對方。數據庫似乎是更好的解決方案。我還要補充一點,就像旁註一樣,不要使用主機IP地址,而是使用會話ID。否則,您可能會遇到與我和我的妻子同時收聽的問題,因爲我們都認爲您的IP地址相同(位於NAT防火牆後面)。 – CodingGorilla 2010-08-13 20:27:06

+0

雖然潛在的合理建議,它並沒有回答這個問題。也許@Adir正在爲小發行版編寫一個簡單的應用程序。 – ddc0660 2010-08-13 20:54:22

+0

@ ddc0660實際上我仍然不知道我的web應用程序有多大,我需要使用可擴展的解決方案。 將其存儲在數據庫中會很快填滿數據庫,也許我需要每X天清空一次該表格。這是一個好的解決方案嗎? – Adir 2010-08-14 00:21:54

0

我打算從純粹的緩存角度來處理這個問題,而不是劇本和曲目的上下文。

決定緩存數據時,重要的是要考慮依賴關係以及緩存過期的方式。

如果每個用戶的緩存都可以單獨過期而不是過期如何,那很好。如果事實證明一個記錄過期應該使整組記錄無效,那麼將其放入一個ArrayList並轉儲整個對象。

相關問題