MemoryCache
와 사이에 차이점이 있는지 궁금합니다. 어떤 HttpRuntime.Cache
것이 ASP.NET MVC 프로젝트에서 선호됩니까?
내가 이해하는 한, 둘 다 스레드로부터 안전하고 API는 첫눈에 어느 정도 동일하므로 사용할 때 차이가 있습니까?
답변:
HttpRuntime.Cache
Cache
현재 애플리케이션에 대한를 가져옵니다 .
이 MemoryCache
클래스는 ASP.NET Cache
클래스 와 유사합니다 .
이 MemoryCache
클래스에는 ASP.NET Cache
클래스를 사용한 경우 익숙한 캐시 액세스를위한 많은 속성과 메서드가 있습니다 .
주요 차이점 HttpRuntime.Cache
및 MemoryCache
후자는 ASP.NET 응용 프로그램에없는 .NET Framework 응용 프로그램이 사용할 수 있도록 변경되었습니다 점이다.
추가 정보 :
업데이트 :
유저들의 피드백에 따르면 가끔 Jon Davis 블로그가 작동하지 않는 경우가 있으므로 전체 글을 이미지로 담았습니다.
참고 : 명확하지 않은 경우 이미지를 클릭하면 브라우저에서 열리고 다시 클릭하면 확대됩니다.
여기에 Jon Davis의 기사가 있습니다. 가독성을 유지하기 위해 지금은 사용되지 않는 EntLib 섹션, 소개 및 결론을 잘라내겠습니다.
ASP.NET 또는 System.Web.dll 어셈블리에는 캐싱 메커니즘이 있습니다. 웹 컨텍스트 외부에서 사용할 수는 없지만 웹 외부에서 사용할 수 있으며 해시 테이블에서 위의 모든 만료 동작을 수행합니다.
Google을 살펴본 후 .NET의 기본 제공 캐싱 기능에 대해 논의한 많은 사람들이 웹이 아닌 프로젝트에서 ASP.NET 캐시를 사용하는 것으로 보입니다. 이것은 더 이상 .NET에서 가장 많이 사용 가능하고 가장 많이 지원되는 내장 캐싱 시스템이 아닙니다. .NET 4에는 나중에 살펴볼 ObjectCache가 있습니다. Microsoft는 ASP.NET 캐시가 웹 외부에서 사용하기위한 것이 아니라는 점을 항상 단호했습니다. 그러나 많은 사람들이 여전히 .NET 2.0 및 .NET 3.5에 갇혀 있고 작업 할 무언가가 필요합니다. MSDN이 다음과 같이 분명히 말 했음에도 불구하고 이는 많은 사람들에게 작동합니다.
참고 : Cache 클래스는 ASP.NET 응용 프로그램 외부에서 사용하기위한 것이 아닙니다. 웹 응용 프로그램에 대한 캐싱을 제공하기 위해 ASP.NET에서 사용하도록 설계 및 테스트되었습니다. 콘솔 응용 프로그램이나 Windows Forms 응용 프로그램과 같은 다른 유형의 응용 프로그램에서는 ASP.NET 캐싱이 제대로 작동하지 않을 수 있습니다.
ASP.NET 캐시의 클래스는 System.Web.dll의 System.Web.Caching.Cache입니다. 그러나 단순히 Cache 개체를 새로 만들 수는 없습니다. System.Web.HttpRuntime.Cache에서 가져와야합니다.
Cache cache = System.Web.HttpRuntime.Cache;
ASP.NET 캐시 작업은 여기 MSDN에 문서화되어 있습니다 .
Microsoft는 마지막으로 최신 버전의 .NET Framework에서 추상 ObjectCache 클래스를 구현했으며 웹이 아닌 설정에서 메모리 내 목적으로 ObjectCache를 상속하고 구현하는 MemoryCache 구현을 구현했습니다.
System.Runtime.Caching.ObjectCache는 System.Runtime.Caching.dll 어셈블리에 있습니다. 기본적으로 ASP.NET 캐시에있는 것과 동일한 .NET 1.0 스타일 인터페이스를 선언하는 추상 클래스입니다. System.Runtime.Caching.MemoryCache
ObjectCache의 메모리 내 구현이며 몇 가지 변경 사항 만 제외하면 ASP.NET 캐시와 매우 유사합니다.
슬라이딩 만료가있는 항목을 추가하려면 코드는 다음과 같습니다.
var config = new NameValueCollection();
var cache = new MemoryCache("myMemCache", config);
cache.Add(new CacheItem("a", "b"),
new CacheItemPolicy
{
Priority = CacheItemPriority.NotRemovable,
SlidingExpiration=TimeSpan.FromMinutes(30)
});
ASP.NET 캐시와 달리 MemoryCache 개체 인스턴스를 인스턴스화 할 수 있습니다.
참고 : 정적 일 필요는 없지만 Microsoft의 권장 사항입니다 (노란색주의 참조) .
ASP.NET 캐시의 인터페이스에 비해 항목이 추가되고 중복 된 Insert ()가 제거되고 CacheItem을 사용하여 항목을 추가 할 수있는 항목이 없어도 제거 이벤트를 구독하는 기능과 같은 약간의 개선이 이루어졌습니다. 캐싱 전략을 정의하는 이니셜 라이저가있는 개체 및 Contains ()가 추가되었습니다.
명시 적 또는 슬라이딩 만료를 수행하는 캐싱 사전을 만드는 것은 실제로 매우 간단합니다. (메모리 정리를 위해 항목을 자동 제거하려는 경우 훨씬 더 어려워집니다.) 다음은 수행 할 모든 작업입니다.
마이크로 소프트는 사용자 기반이 그들에 대한 의존성을 구축했기 때문에 원래 디자인을 지원해야하지만 그것이 좋은 디자인이라는 의미는 아닙니다.
IDictionary<K,T>
있습니다. 이렇게하면 인터페이스가 사전 인터페이스로 더 예측 가능하므로 훨씬 쉽게 사용할 수 있으며 IDictionary <>와 함께 작동하는 도우미 및 확장 메서드에 더 쉽게 액세스 할 수 있습니다.이 네 가지 옵션 중에서 이것이 제가 선호하는 옵션입니다. 이 기본 캐싱 솔루션을 구현했습니다. 지금까지 완벽하게 작동하는 것 같습니다. 알려진 버그는 없습니다 (아래 의견을 보내 주시거나 jon-at-jondavis에 연락해주세요 !!). 필요한 모든 소규모 프로젝트에서 사용할 예정입니다 기본 캐싱. 여기있어:
Github 링크 : https://github.com/kroimon/ExpirableItemDictionary
이전 링크 : ExpirableItemDictionary.zip
이 블로그 기사의 제목은 "Heavy-Duty Caching"이 아니라 "Simple Caching"을 나타냅니다. 무거운 작업을 수행하려면 전용 스케일 아웃 솔루션을 찾아야합니다.
MemoryCache는 메모리에 저장된 캐시입니다.
HttpRuntime.Cache ( http://msdn.microsoft.com/en-us/library/system.web.httpruntime.cache (v = vs.100) .aspx 및 http://msdn.microsoft.com/en- 참조) us / library / system.web.caching.cache.aspx )는 애플리케이션에서 구성한 모든 항목에 유지됩니다.
예를 들어 "ASP.NET 4.0 : 사용자 지정 출력 캐시 공급자 작성" http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache를 참조하십시오. -providers.aspx