2012-09-07 34 views
3

MemoryCache是​​否具有緩存固定數量項目的功能?MemoryCache具有一定數量的項目

例如我們只對來自數據庫的緩存2000項目感興趣。在向緩存中添加項目的同時,如果超過了指定的項目數,則可以刪除最舊的項目。

如果不是,我們是否必須使用另一個線程定期進行房屋管理?

+0

你的意思是[System.Runtime.Caching.MemoryCache](http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx)? –

回答

6

它沒有內置任何內容,將限制對象的數量。相反,它會檢查正在使用多少內存,並將其與CacheMemoryLimit進行比較。如果超出CacheMemoryLimit,則會丟棄較舊的項目。您也可以通過CacheItemPolicy將項目設置爲在一段時間後自動過期。

如果您真的將它用作內存緩存,這兩種方法都會更有意義。換句話說,如果您擔心內存限制與獲取數據成本之間的折衷,這些是確定何時從緩存中驅逐項目的好方法。所以問問自己:

我真的想用這個作爲一個MemoryCache?爲什麼我甚至在乎從數據庫只加載了2000個項目?

如果您擔心內存開銷,或者如果您擔心項目過期,還有其他(更好的)管理緩存的方式,而不是指定多個對象。如果您在數據結構中保留特定數量的對象有一些自定義原因,請考慮使用不同的類。

+1

這個。限制高速緩存中實際項目的數量似乎也很奇怪,通常您希望高速緩存中有儘可能多的項目。空內存浪費了內存。 – Matthew

1

另一種選擇是創建一個新的MemoryCache提供程序,它爲您執行對象限制管理。這將覆蓋一些MemoryCache方法,例如添加和移除,並在達到任意限制(例如2000個對象)後自動滾降項目。

一種這樣的實施方式可以如下所示:

public class ObjectLimitMemoryCache : MemoryCache 
{ 
private const int ObjectLimit = 2000; 
private const string IndexKey = "ObjectLimitIndexKey"; 

public ObjectLimitMemoryCache(string name, NameValueCollection config) 
: base (name, config) 
{ 
} 

new public static ObjectLimitMemoryCache Default { get { return new ObjectLimitMemoryCache(Guid.NewGuid().ToString(), new NameValueCollection());}} 

public override bool Add(string key, Object value, DateTimeOffset absoluteExpiration, string region = null) 
{ 
    try 
    { 
     var indexedKeys = (List<string>)(base.Get(IndexKey) ?? new List<string>()); 
     if (base.Add(key, value, absoluteExpiration)) 
     { 
      string existingKey; 
      if (string.IsNullOrEmpty(existingKey = indexedKeys.FirstOrDefault(x=>x == key))) 
      { 
       indexedKeys.Add(key); 
      } 
      if (base.GetCount() > ObjectLimit) 
      { 
       base.Remove(indexedKeys.First()); 
       indexedKeys.RemoveAt(0); 
      } 
      base.Add(IndexKey, indexedKeys, new DateTimeOffset(DateTime.Now.AddHours(2))); 
      return true; 
     } 
     return false; 
    } 
    catch 
    { 
//Log something and other fancy stuff 
     throw; 
    } 
} 
} 

這是未測試的代碼並且僅僅意在舉例說明的MemoryCache的示例實現。祝你好運!

+0

非常感謝您的回覆 – user1604006

相關問題