2012-09-07 8 views
3

메모리 캐시에 고정 된 수의 항목을 캐시하는 기능이 있습니까?특정 항목 수의 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 공급자를 만드는 것입니다. 이것은 임의의 한도 (예 : 2000 개체)에 도달하면 항목을 추가 및 제거하고 항목을 자동으로 롤오프하는 등의 MemoryCache 메서드 중 일부를 재정의합니다.

하나는 이러한 구현은 다음과 같이 보일 수 있습니다 :

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

관련 문제