2012-06-20 82 views
0

可能重複:
Linq performance for in-memory collection緩存策略有更好的表現

我有大約100萬用戶的Web應用程序。幾乎應用程序中的每個網頁都會調用GetUser()方法(加載活動流中的名字和其他用戶詳細信息)。 現在我正在爲每次調用敲擊數據庫,並且正在考慮緩存內存中的所有用戶,並使用Linq從那裏獲取搜索結果或GetUser()。

我唯一的問題是是否緩存所有用戶(在內存中)是一個好主意。我會浪費我的RAM嗎? 我個人認爲從RAM中讀取數據比從數據庫讀取要快得多(即使數據庫已經過優化和索引)。

請注意,我已經處理了緩存驗證/更新/等。

是否stackoverflow緩存其所有用戶?

+0

它是一個網絡農場嗎? – Paparazzi

+0

是不是這個問題是一樣的http://stackoverflow.com/questions/11124273/linq-performance-for-in-memory-collection/11124548#11124548 –

+0

你在說多少用戶數據?如果它只是用戶名和其他一些字段,你可以考慮將它序列化到auth cookie中,然後在需要時從數據庫中延遲加載完整的用戶數據。 – Nathan

回答

1

我們做了類似的事情,但不是轉向Linq,而是在每臺Web服務器上安裝了SQL Server Express的副本。我們會將用戶數據更改推送到每個Web服務器,並且本地應用程序正在使用中間層,並且僅定期從本地數據庫提取數據(但至少是本地數據,而不是每個人都訪問數據庫)。

您用於緩存的技術以及應用程序(或Linq)知道何時刷新其本地副本的方式取決於緩存數據允許的陳舊程度。

+0

我們正在使用更新等事件來動態更新緩存。爲了緩存,我們使用內存中的.NET緩存對象。 –

+0

顯然後視 - 但在這種情況下,你會不會更好地使用緩存服務器? –

+0

@Stuart也許?這是在2000年代redis/memcached等成熟之前。即使在今天,團隊仍然可以選擇本地數據庫方法,因爲他們不需要學習新技術來實現/與之交互。兩者都將使用應用程序服務器上的內存,而不是主數據庫服務器上的任何資源。 –

1

如果GetUser大部分時間都會返回同一組用戶,並且大多數用戶很少會被檢索到,那麼您可以嘗試一種混合方法,在其中設置字典(或其他集合)並檢查該集合首先它不存在,然後從數據庫中獲取它並將其存儲到集合中。

使用這種方法,你也可以使用Cache,因爲它已經有內置的機制去陳舊和清理自己了。在說過這些之前,我曾經在一個項目中對用戶做過同樣的事情(儘管我們只有大約100個用戶),我們所有的研究和測試都發現,每次訪問數據庫都會更快。

+0

您也可以爲集合添加一些條件,以便最頻繁的用戶更有可能在收集中比不頻繁登錄的用戶 – Gisli