2012-06-13 3 views
8

MemoryCache에 대한 일반적인 대체/구현이 있습니까?System.Runtime.Caching.MemoryCache의 일반 구현

MemoryCache가 Hashtable을 사용한다는 것을 알고 있으므로 Hashtable의 제네릭 버전 인 Dictionary <>을 사용하면됩니다.

이렇게하면 유형 안전성을 제공하고 권투/복화 제거시 성능 이점을 제공합니다.

EDIT : 내가 관심이있는 또 다른 사항은 다른 키 유형입니다. 기본값은 System.String입니다.

+0

는하지만 당신은 할 수있을 것 한 가지 유형을 캐시하려면? 나는이 비용을 너무 많이 걱정하지 않을 것이고, 복싱 부분은 원시 값 유형에 대해 무시할 수있을 것입니다. –

+0

@AdamHouldsworth : 예, 그럴 의도입니다.한 가지 유형 만 반환하는 슬라이딩 만료를 사용하여 데이터베이스 맵에 캐시를 래핑합니다. – caesay

+0

해당 유형이 값 유형입니까? –

답변

13

MemoryCache의 일반적인 대체/구현이 있습니까?

기본 클래스 라이브러리에 없습니다. 개인적으로는 자신이 원하는 API를 제공하는 MemoryCache에 대한 래퍼를 만들지 만 직접 작성해야합니다.

이 유형의 안전을 제공하고

유형의 안전이 래퍼 클래스에 비교적 쉽게 처리 할 수 ​​있습니다 개봉기/아니오 복싱으로 성능 이점을 제공한다. boxing/unboxing은 값 유형 (클래스가 아님)을 저장하는 경우에만 문제가 될 수 있으며, 심지어는 실제 성능이 될만큼 자주 캐시를 밀고 당기는 것 같지 않으므로 최소값 일 가능성이 높습니다. 발행물. 형태의 안전성 및 유용성에 관해서는

, 나는 실제로 API 관점에서 조금 더 좋은 사용을 허용하는 일반적인 방법,에 MemoryCache 항목의 호출을 래핑하는 내 자신의 방법을 서면으로 작성했습니다. 매우 간단합니다. 일반적으로 다음과 같은 방법이 필요합니다.

public T GetItem<T>(string key) where T : class 
{ 
    return memoryCache[key] as T; 
} 

마찬가지로 값을 설정하는 방법을 만들 수 있습니다.

EDIT : 내가 관심이있는 또 다른 사항은 다른 키 유형입니다. 기본값은 System.String입니다.

이것은 MemoryCache과 직접적으로 지원되지 않으므로 직접 키 생성을 위해 약간의 작업이 필요합니다. 하나의 옵션은 형식 안전 래퍼를 만드는 것입니다.이 래퍼는 Func<T, string>을 제공하여 값을 기반으로 문자열 키를 생성합니다. 따라서 어떤 유형의 캐시 항목도 생성 할 수 있습니다 (T). 그러나 비교의 일부로 원하는 문자열에 모든 데이터를 포함하려면주의해야합니다.

+0

나는 boxing/unboxing이 유효한 관심사라고 생각한다 - 만약 당신이 참으로 캐싱 값 유형이라면. 캐시를 사용하는 주된 이유 중 하나는 높은 빈도로 값을 계산하기 때문입니다. 따라서 캐시가 많이 충돌하는 일반적인 상황이 될 수 있습니다. 어쩌면 복싱 비싼 만들 수있을만큼 충분히 치고있어 비정상적인 경우이지만 그것은 응용 프로그램이 GC의 압력에 얼마나 민감한가에 따라 달라집니다. –

관련 문제