2013-10-25 96 views
3

.NET緩存中是否有最大數量的鍵/元素?如果是,那麼這個限制是多少?我不是指以MB爲單位的最大緩存大小。.NET緩存:元素的最大數量

+4

你的意思是'System.Web.Caching.Cache' ?如果是這樣,這取決於['EffectivePercentagePhysicalMemoryLimit'](http://msdn.microsoft.com/en-us/library/system.web.caching.cache.effectivepercentagephysicalmemorylimit.aspx)和'EffectivePrivateBytesLimit'。否則,這取決於你的記憶。與每個集合一樣,您可以添加項目,直到出現「OutOfMemoryException」。 –

+0

有'網頁緩存',有'企業庫緩存',現在是'運行時緩存'的一部分,有'AppFabric緩存'。但嚴重的是,他們都沒有限制項目的數量,只有內存量可以拋棄它們。其中一些實際上可以檢測到它們何時耗盡內存並開始卸載自己。 –

回答

0

不能有以字節爲單位的準確限值及其執行不知道物體有多少字節需要(有可能弄清楚,但不提供外的框)。沒有像「sezeofobject(reference)」這樣的內置函數,因爲不可能說出「對象結束」的位置。假如你有一個物體指向另外3個物體,它們是否應該算作原始物體的一部分?

無論如何,儘管可以間接評估一個緩存解決方案需要多少ram,但不可能做到準確,例如,可能只是使用反射來計算字段數量並使用sizeof( )原始類型等。但是,這又會給出一個球場號碼。

我們如何解決這個問題 - 我們序列化,我們保持字節[]對象 - 這殺死一個子彈許多兔子:

  • 對象從緩存中返回的「不可見」 GC和不 穿上圖的遍歷任何內存壓力
  • 我們可以知道一個對象圖究竟有多少字節需要
  • 從緩存中返回的對象是100%線程安全的副本

GC是最大的問題。

與.NET提供的緩存類是方便,但有一個主要的問題 - 他們不能存儲大量的數據(上千萬+)很長一段時間的對象,而不殺死你的GC。如果你緩存了幾千個對象,那麼它們的工作效果很好,但是當你移動到數百萬個並保留它們直到它們傳播到GEN2時 - 當系統達到低內存閾值並且GC需要掃描時,GC暫停最終會開始顯着所有的氏族。

實用性是這樣的 - 如果你需要存儲幾十萬實例 - 使用MS緩存。如果您的對象是2場或25場,則無關緊要 - 與參考的數量有關。

在另一方面存在這樣的情況時大的RAM,其是常見的這些日子裏,需要利用,即64 GB。爲此,我們創建了一個100%託管的內存管理器和高速緩存。

我們的解決方案可以很容易地存儲在存儲器中,過程3億對象,而完全不徵稅GC - 這是因爲我們在存儲大(250 MB)數據字節[]段。

下面是代碼:NFX樁(阿帕奇2.0) https://github.com/aumcode/nfx/blob/master/Source/NFX/ApplicationModel/Pile/ICache.cs

和視頻:NFX樁緩存 - 的Youtube

https://www.youtube.com/watch?v=Dz_7hukyejQ