문제

ASP.NET 응용 프로그램에서 사용하는 클래스 라이브러리에서 캐시를 구현하고 있습니다.

캐시가 필요한 데이터 모음으로 멤버 변수/속성을로드하는 캐시를 업데이트하는 정적 메소드가있는 싱글 톤 패턴으로 캐시 객체를 만들었습니다 (물론 잠금 로직을 얻었습니다). 나는 전화를 통해 내 데이터에 액세스 할 수 있기 때문에 좋은 방법이라고 생각했습니다.

MyCacheObject.Instance.MyDataCollection

키로 파티셔닝 된 매우 많은 양의 데이터를 저장하기 위해 새 캐시 객체를 만들고 있습니다. 내가 말하는 것은 새 캐시를 만들고 있지만이 캐시는 모든 데이터를 한 번에로드하지 않고 액세스 된 각 키에 대한 컬렉션을 저장합니다.

MyOtherCacheObject.Instance.MyOtherDataCollection(indexkey)

이번에는 쓰레기 수거에 대한 질문이 제기되었습니다. 엄청난 양의 데이터를 저장하고 있기 때문에 갑자기 GC를 얻었다면 폐기물이 아닐까요? 단지 싱글 톤 패턴이기 때문에 데이터가 캐시에 머무를 수있는 것은 없습니다.

그래서 제 질문은 -이 상황을 처리하기 위해 캐시를 구현하기위한 모범 사례는 무엇입니까? 나는 이것에 대한 거대한 복잡한 해결책을 정말로 좋아하지 않으며, 시스템에 캐싱이 있다는 것을 알고 있지만, 이것은 단지 클래스 라이브러리이기 때문에 약간 '꺼져있는 것 같아요, 아니면 어떻게 생각하십니까?

도움이 되었습니까?

해결책

제 생각에 최상의 솔루션은 다음과 같은 특성을 가질 것입니다.

  • 플랫폼이 제공하는 사용 가능한 캐싱 서비스를 사용하여 자신의 글을 쓰지 않도록 노력합니다.

  • 레이어를 일관성있게하기 위해 클래스 라이브러리를 System.Web에 부여하지 않습니다.

  • 그러나 클래스 라이브러리가 ASP.NET 응용 프로그램 내에서 실행중인 경우 솔루션은 추가 구성 및 설정이 필요한 다른 캐싱 구현 (예 : Enterprise Library Caching Application Block)을 가져와야하지 않아야합니다.

따라서 클래스 라이브러리가 실행중인 환경에 따라 다른 캐싱 구현을 사용할 수 있도록 IOC 전략을 사용합니다.

추상 캐싱 계약을 다음과 같이 정의한다고 가정 해 봅시다.

public interface ICacheService 
{
    AddItem(...);
}

System.web : Web : 구현을 제공 할 수 있습니다.

public AspNetBasedCacheService : ICacheService
{
    AddItem(...)
    {
        // Implementation that uses the HttpContext.Cache object
    }
 }

그런 다음 해당 구현을 싱글 톤으로 '게시'하십시오. 원래 접근 방식과의 차이점은 싱글 톤이 전체 '캐시 객체'대신 ASP.NET 캐시 서비스 기반 구현에 대한 참조 일뿐입니다.

public class ChacheServiceProvider 
{
    public static IChacheService Instance {get; set;}

}

게으른 초기화를 수행하거나 응용 프로그램 시작 (Global.asax.cs)에서 샤치 구현을 초기화해야합니다.

그리고 모든 도메인 구성 요소는 System.Web를 기반으로 구현되었음을 알지 못하고 게시 된 캐싱 서비스를 사용할 수 있습니다.

// inside your class library:
IChacheService chache = CacheServiceProvider.Instance;
cache.AddItem(...);

나는 그것이 가장 간단한 솔루션이 아닐 수도 있다는 데 동의하지만, 코드 디퍼 커플 링 및 유연성을 희생하지 않고 ASP.NET 캐시 구현을 활용하는 것을 목표로하고 있습니다.

나는 당신의 질문을 올바르게 이해하기를 바랍니다.

다른 팁

캐시가 여전히 참조를 보유하는 한 데이터는 쓰레기를 수집하지 않습니다.

또한 싱글 톤을 사용하지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top