메모리 캐시에 고정 된 수의 항목을 캐시하는 기능이 있습니까?특정 항목 수의 MemoryCache
우리는 데이터베이스의 캐시 2000 항목에만 관심이 있습니다. 캐시에 항목을 계속 추가하는 동안 지정된 항목 수가 초과되면 가장 오래된 항목을 제거 할 수 있습니다.
그렇지 않은 경우 정기적으로 주택을 유지하기 위해 다른 스레드를 사용해야합니까?
메모리 캐시에 고정 된 수의 항목을 캐시하는 기능이 있습니까?특정 항목 수의 MemoryCache
우리는 데이터베이스의 캐시 2000 항목에만 관심이 있습니다. 캐시에 항목을 계속 추가하는 동안 지정된 항목 수가 초과되면 가장 오래된 항목을 제거 할 수 있습니다.
그렇지 않은 경우 정기적으로 주택을 유지하기 위해 다른 스레드를 사용해야합니까?
개체 수를 제한하는 기본 제공 항목이 없습니다. 대신, 사용중인 메모리의 양을 확인하고이를 CacheMemoryLimit
과 비교합니다. CacheMemoryLimit
이 초과되면 이전 항목이 삭제됩니다. CacheItemPolicy
을 통해 특정 시간이 지나면 자동으로 만료되도록 항목을 설정할 수도 있습니다.
이러한 접근 방식은 실제로 메모리 캐시로 사용하는 경우 더 적합합니다. 다시 말해, 메모리 제한과 데이터 가져 오기 비용 간의 균형을 고려한다면 캐시에서 항목을 제거 할시기를 결정하는 훌륭한 방법입니다. 자문 해보십시오 :
정말 이것을 MemoryCache로 사용하려고합니까? 데이터베이스에서 2000 개의 항목 만로드 된 경우 왜 걱정합니까?
메모리 오버 헤드가 염려되거나 항목이 오래되어서 걱정되는 경우 많은 수의 개체를 지정하는 것보다 캐시를 관리하는 다른 방법이 더 좋습니다. 특정 수의 오브젝트를 데이터 구조에 보관할 사용자 정의 이유가있는 경우 다른 클래스 사용을 고려하십시오.
이것은. 또한 캐시의 실제 항목 수를 제한하는 것이 이상하게 보입니다. 일반적으로 가능한 많은 항목을 캐시에 저장하려고합니다. 빈 메모리는 낭비되는 메모리입니다. – Matthew
또 다른 옵션은 개체 제한 관리를 수행하는 새 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의 구현 예를 설명하기 위해 전적으로 의미입니다. 행운을 빕니다!
답장을 보내 주셔서 감사합니다. – user1604006
[System.Runtime.Caching.MemoryCache] (http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx)를 의미합니까? –