ASP.NET 용 지속성 파일 시스템 디스크 캐시

요약 : https://www.codeproject.com/articles/12097/cache-management-in-asp-net
동일한 개념, 즉 데이터 관리를 설명하기 위해 다른 용어를 사용하십시오. 어떤 사람들은이를 국가 관리라고하며 일부는이를 캐시 관리라고합니다. "캐시"라는 단어가 마음에 듭니다. 그러나 개념적 으로이 둘 사이에는 차이가 없습니다.
이제 ASP.NET의 캐시 관리 (또는 상태 관리)의 다양한 측면에 대해 논의 해 봅시다.
Windows 애플리케이션에서는 캐시 관리가 문제가되지는 않지만 웹 환경에서는 항상 어려운 문제였습니다. HTTP는 무국적 프로토콜이고 웹 서버는 다른 요청간에 사용자를 인식하지 않기 때문에 다른 요청간에 특정 사용자를 인식하고 다른 요청간에 재사용 할 수 있도록 데이터를 저장하는 것이 매우 중요합니다. ASP.NET은 클라이언트 (브라우저)와 서버 (웹 서버) 측면에서 데이터를 저장하기위한 많은 기능을 제공하지만 때로는 사용시기와 혼동됩니다. ASP.NET에서는 세션, 애플리케이션 및 캐시 객체와 같은 기능을 발견하지만 웹 응용 프로그램에서 효과적으로 사용하려면 차이점을 이해하는 것이 중요합니다.
이 기사에서는 ASP.NET에서 사용 가능한 다양한 캐시 관리 옵션에 대해 설명합니다. 웹 애플리케이션에서는 때때로 데이터 저장소에서 비용이 많이 드는 데이터 검색 작동을 피하기 위해 서버 측에 데이터를 저장하고 응용 프로그램 성능을 향상시키고 사용자, 애플리케이션 및 기계의 후속 요청에서 동일한 데이터를 재사용하기 위해 데이터 포맷 로직에서 비용이 많이 드는 데이터 검색 작동을 피해야합니다. 따라서이를 달성하려면 서버 측에 데이터 (캐시)를 저장해야합니다.
캐싱은 QOS (서비스 품질)의 세 가지 중요한 측면을 달성하는 데 도움이됩니다.
ASP.NET은 모든 사용자 요청에 액세스 할 수있는 데이터를 저장하기 위해 Application Object라는 객체를 제공합니다. 이 객체의 수명은 응용 프로그램에 묶여 있으며 응용 프로그램이 시작될 때마다 재조정됩니다. ASP.NET 세션 객체와 달리이 개체는 모든 사용자 요청에 액세스 할 수 있습니다. 이 스토리지는 애플리케이션 도메인 공간에서 생성되고 유지되므로 웹 팜 시나리오에서 데이터 저장에 사용해서는 안됩니다. 이 옵션은 응용 프로그램 시작 중에 응용 프로그램 개체에로드 할 수있는 응용 프로그램 메타 데이터 (구성 파일 데이터)와 같은 데이터를 저장하는 데 매우 유용하며 각 사용자 요청에 대해 매번 다시로드하지 않고 응용 프로그램 수명 동안 사용할 수 있습니다. 그러나 응용 프로그램이 실행중인 동안 구성 파일을 변경할 때마다 캐시 된 데이터를 무효화 해야하는 경우 캐시 된 데이터를 만료하는 기능을 제공하지 않으므로이 옵션을 사용해서는 안됩니다. 따라서이 경우 ASP.NET 캐시 객체와 같은 다른 옵션을 사용해야하며 아래에 설명되어 있습니다.
asp.net은 system.web.caching 네임 스페이스에서 사용 가능한 캐시 객체 인 키 값 쌍 개체를 제공합니다. 그것의 범위는 애플리케이션 도메인이며 수명은 응용 프로그램에 묶여 있습니다. ASP.NET 세션 객체와 달리이 개체는 모든 사용자 요청에 액세스 할 수 있습니다.
애플리케이션 객체와 캐시 객체가 모두 동일하게 보이지만 이들 사이의 주요 차이점은 만료 정책 및 종속성과 같은 캐시 객체에서 제공하는 추가 기능입니다. 이는 캐시 객체에 저장된 데이터가 응용 프로그램 코드에 의해 설정된 일부 사전 정의 된 시간 제한 또는 종속 엔티티가 변경되는 반면이 기능은 애플리케이션 객체에서 사용할 수없는 경우 만료/제거 될 수 있음을 의미합니다.
다른 만료 정책과 지원되는 종속성에 대해 논의합시다.
종속성은 종속 엔티티가 변경되면 캐시에서 항목을 제거 할 수 있음을 의미합니다. 따라서 캐시에서의 제거가 종속에 의존하는 항목에 따라 종속 관계를 정의 할 수 있습니다. ASP.NET에는 지원되는 두 가지 유형의 종속성이 있습니다.
예 : 응용 프로그램에서 XML 파일을 사용하여 런타임시 주어진 오류 번호에 대한 오류 메시지를 검색하는 데 사용되는 오류 세부 정보 (오류 번호 및 오류 메시지 매핑)를 저장하고 있다고 가정 해 봅시다. 따라서 오류 메시지가 필요할 때마다 디스크에서 파일을 읽는 대신 응용 프로그램 시작시 1 회로드하여 추가 사용을 위해 ASP.NET 캐시에 저장하기로 결정했다고 가정 해 봅시다. 따라서 새 오류 메시지를 추가하기 위해 구성 파일을 변경하거나 응용 프로그램이 실행중인 기존 오류 메시지를 변경 해야하는 경우 캐시 된 데이터는 어떻게됩니까? 응용 프로그램의 파일 변경을 반영하려면 응용 프로그램을 중지하고 다시 시작해야합니까? 대답은 아니오입니다. 파일 종속성 옵션을 사용하여 파일이 변경 될 때마다 캐시 데이터가 무효화 될 수 있습니다.
만료 정책은 캐시의 항목이 만료되어야하는 방법과시기에 대한 정책을 설정합니다.
.NET 리모 팅 싱글 톤 객체는 여러 클라이언트와 동일한 인스턴스를 공유하므로 싱글 톤 객체를 사용하여 다른 클라이언트 호출간에 데이터를 저장하고 공유 할 수 있습니다. .NET 리모 팅은 프로세스 및 컴퓨터 외부에서 사용될 수 있으므로이 옵션은 특히 웹 팜 시나리오에서 서버 및 사용자간에 데이터를 캐시하고 공유 할 때 매우 유용합니다. 이 접근법에서는 데이터를 싱글 톤 리모 팅 객체의 멤버 변수로 저장하고 데이터를 읽고 저장하는 방법을 제공 할 수 있습니다. 그러나이를 구현하는 동안 캐시로 사용되는 원격 객체가 쓰레기 수집기에 의해 파괴되지 않도록해야합니다. 이를 위해서는 리모싱 캐시 객체의 임대 기간을 무한대로 설정하여 임대 기간이 결코 배제되지 않도록해야합니다. MarshalbyRefobject의 InitializeLifetimeservice 메소드를 재정의 하고이 방법에서 NULL을 반환하여 그렇게 할 수 있습니다. 그러나이 접근법의 유일한 문제는 성능입니다. 분석에서 알 수 있듯이 다른 접근법과 비교할 때이 접근법에서 성능은 매우 열악합니다. 어쨌든, 다양한 옵션을 분석하고 요구 사항에 맞는 최고의 옵션을 사용하는 것은 응용 프로그램 디자이너/개발자에게 달려 있습니다.
당신은 모두 메모리 매핑 된 파일이 무엇인지 알고 있습니다. 기본적으로 디스크에서 파일을 응용 프로그램의 프로세스 주소 공간에서 특정 주소 범위에 매핑하는 것입니다. 이 옵션을 사용하면 응용 프로그램 성능을 높이면 다른 프로세스가 동일한 데이터를 사용할 수 있습니다. .NET 개발자들 사이에서 메모리 매핑 된 파일을 사용하는 것은 그다지 인기가 없기 때문에 개인적 으로이 접근법을 구현하는 데는 많은 복잡성이 포함되며 .NET Framework는이를 지원하지 않습니다. 그러나이 접근법을 사용하는 데 관심이 많은 사람이라면 자체 요구 사항에 따라 자체 사용자 정의 솔루션을 개발해야합니다.
우리는 데이터 또는 객체를 전 세계적으로 저장하기 위해 정적 변수를 사용하여 응용 프로그램 수명 동안 액세스 할 수 있습니다. 마찬가지로 ASP.NET에서는 데이터 캐싱에 정적 객체를 사용할 수 있으며 캐시에 데이터를 검색하고 저장하는 메소드를 제공 할 수도 있습니다. 정적 변수가 프로세스 영역에 저장되므로 성능은 더 빠릅니다. 그러나 정적 변수의 경우 만료 정책 및 종속성을 구현하는 것이 매우 어렵 기 때문에 일반적 으로이 옵션보다 ASP.NET 캐시 객체를 선호합니다. 또 다른 문제는 사용자 정의 정적 캐시 객체가 신중하게 구현되어야하는 스레드 안전이어야한다는 것입니다.
또한 데이터를 저장하고 사용자 및 기계에서 데이터를 공유하는 데 데이터베이스를 사용 할 수도 있습니다. 이 접근법은 많은 양의 데이터를 캐시하려는 경우 매우 유용합니다. 소량의 데이터를 저장하기 위해이 접근법을 사용하는 것은 성능으로 인해 좋은 생각이 아닙니다. 소량의 데이터를 저장하려면 다른 ASP.NET 인 프로세스 캐싱 메커니즘을 사용해야합니다. 데이터가 데이터베이스에 저장되어야하므로 모든 객체를 XML 직렬화하여 저장 및 검색하기가 더 쉽습니다. .NET 프레임 워크에서 사용 가능한 다른 유형의 직렬화 형식을 사용할 수도 있습니다.
때로는 응용 프로그램에서 일부 페이지에서는 출력이 일반적으로 특정 기간 동안 변경되지 않습니다. 예를 들어, HR 웹 사이트에서 직원의 급여 세부 사항은 매우 자주 변경되지 않으며 한 달에 한 번만 변경됩니다. 일반적으로 매월 첫날에만 변경됩니다. 따라서 한 달 동안 급여 세부 정보 페이지에는 특정 직원에 대해 동일한 세부 정보가 표시됩니다. 따라서이 경우 직원이 급여 세부 정보를보고 싶을 때마다 비즈니스 계산 처리, 데이터베이스에 대한 호출 및 페이지 렌더링 로직을 피하기 위해 서버 어딘가에 페이지를 캐시하는 것이 좋습니다. 내 생각에, 그렇습니다! 아주 좋은 생각입니다. 이를 달성하기 위해 ASP.NET은 특정 기간 동안 서버에 페이지 출력을 저장하는 기능을 제공합니다. 또한 Page Fragment Caching으로 알려진 페이지 조각을 저장하는 기능을 제공합니다.
때로는 응용 프로그램 성능을 향상시키기 위해 클라이언트 측의 데이터 또는 페이지를 캐시해야 할 수도 있습니다. 이 메커니즘을 사용하면 서버의 부하가 줄어들지만이 메커니즘에는 클라이언트 측의 데이터를 캐시 할 때 보안 문제가 있습니다.
쿠키는 각 요청에 대해 서버로 전송되고 서버에서 응답으로 수신되는 클라이언트 측 스토리지입니다. 크기 제한으로 인해 소량의 데이터를 저장하는 데 사용해야합니다. 쿠키가 특정 기간 후에 품목을 무효화 할 수 있도록 만료 정책을 설정할 수 있습니다.
ASP.NET ViewState는 페이지 및 컨트롤과 관련된 데이터가 생성 된 페이지 (클라이언트 측)에 저장되는 WebForms (MVC 아님)에서만 개념입니다. 서버에 대한 여러 요청에 걸쳐 값을 유지합니다. ViewState는 ASP.NET에서 암호화 된 숨겨진 필드로 내부적으로 구현됩니다. ViewState는 각 요청에 대해 서버에 전달되므로 많은 양의 데이터를 저장하는 데 사용해서는 안됩니다.
숨겨진 필드는 페이지의 다른 컨트롤과 유사하지만이 컨트롤의 눈에 보이는 상태는 항상 거짓입니다. ViewState와 마찬가지로 많은 양의 데이터를 저장하는 데 사용해서는 안됩니다. 숨겨진 프레임을 사용하여 클라이언트 측의 데이터를 캐시하는 데 사용될 수 있지만 모든 인터넷 브라우저에서 숨겨진 프레임이 지원되는 것은 아닙니다.
인터넷 브라우저는 클라이언트 쪽의 페이지를 캐시하기위한 캐싱 메커니즘을 제공합니다. 이는 페이지 헤더에 추가 된 Expires Directive를 사용하여 또는 웹 서버에서 수동으로 설정하여 설정할 수 있습니다. 이 옵션을 클라이언트 측에서 정적 페이지, 스크립트, CSS 및 이미지를 캐싱하는 데 사용해야합니다.
Javier Cañon의 ❤️으로 제작되었습니다.