성능 향상을 위해 ASP.NET 웹 페이지(Razor) 사이트에서 데이터 캐싱

Tom FitzMacken

이 문서에서는 도우미를 사용하여 ASP.NET 웹 페이지(Razor) 웹 사이트에서 더 빠른 성능을 위해 정보를 캐시하는 방법을 설명합니다. 일반적으로 검색하거나 처리하는 데 상당한 시간이 걸리며 자주 변경되지 않는 데이터 결과(즉, 캐시)를 저장하여 웹 사이트를 가속화할 수 있습니다.

학습할 내용:

  • 캐싱을 사용하여 웹 사이트의 응답성을 개선하는 방법입니다.

다음은 문서에 도입된 ASP.NET 기능입니다.

  • 도우미입니다 WebCache .

자습서에서 사용되는 소프트웨어 버전

  • ASP.NET 웹 페이지(Razor) 3

이 자습서는 ASP.NET 웹 페이지 2에서도 작동합니다.

누군가가 사이트에서 페이지를 요청할 때마다 웹 서버는 요청을 이행하기 위해 몇 가지 작업을 수행해야 합니다. 일부 페이지의 경우 서버는 데이터베이스에서 데이터를 검색하는 것과 같이 (비교적) 오랜 시간이 걸리는 작업을 수행해야 할 수 있습니다. 이러한 작업이 절대적인 측면에서 오래 걸리지 않더라도 사이트에 많은 트래픽이 발생하는 경우 웹 서버가 복잡하거나 느린 작업을 수행하도록 하는 일련의 개별 요청이 많을 수 있습니다. 이는 궁극적으로 사이트의 성능에 영향을 줄 수 있습니다.

이와 같은 상황에서 웹 사이트의 성능을 개선하는 한 가지 방법은 데이터를 캐시하는 것입니다. 사이트에서 동일한 정보에 대한 반복 요청을 받고 각 사용자에 대해 정보를 수정할 필요가 없으며 시간이 민감하지 않은 경우 데이터를 다시 가져오거나 다시 계산하는 대신 데이터를 한 번 가져온 다음 결과를 저장할 수 있습니다. 다음에 해당 정보에 대한 요청이 들어오면 캐시에서 가져옵니다.

일반적으로 자주 변경되지 않는 정보를 캐시합니다. 캐시에 정보를 넣으면 웹 서버의 메모리에 저장됩니다. 캐시해야 하는 기간을 초에서 일 단위로 지정할 수 있습니다. 캐싱 기간이 만료되면 캐시에서 정보가 자동으로 제거됩니다.

참고

만료된 항목 이외의 이유로 캐시의 항목이 제거될 수 있습니다. 예를 들어 웹 서버가 일시적으로 메모리 부족으로 실행될 수 있으며 메모리를 회수할 수 있는 한 가지 방법은 캐시에서 항목을 throw하는 것입니다. 보듯이 캐시에 정보를 입력한 경우에도 필요할 때 여전히 있는지 확인하기 위해 검사 합니다.

웹 사이트에 현재 온도 및 일기 예보를 표시하는 페이지가 있다고 상상해 보십시오. 이러한 유형의 정보를 얻으려면 외부 서비스에 요청을 보낼 수 있습니다. 이 정보는 크게 변경되지 않으므로(예: 2시간 이내) 외부 호출에는 시간과 대역폭이 필요하므로 캐싱에 적합합니다.

페이지에 캐싱 추가

ASP.NET 사이트에 캐싱을 WebCache 쉽게 추가하고 캐시에 데이터를 추가할 수 있는 도우미가 포함되어 있습니다. 이 절차에서는 현재 시간을 캐시하는 페이지를 만듭니다. 현재 시간이 자주 변경되고 계산이 복잡하지 않기 때문에 이는 실제 예제가 아닙니다. 그러나 작동 중인 캐싱을 설명하는 좋은 방법입니다.

  1. 웹 사이트에 WebCache.cshtml이라는 새 페이지를 추가합니다.

  2. 페이지에 다음 코드 및 태그를 추가합니다.

    @{
        var cacheItemKey = "CachedTime";
        var cacheHit = true;
        var time = WebCache.Get(cacheItemKey);
    
        if (time == null) {
            cacheHit = false;
        }
    
        if (cacheHit == false) {
            time = @DateTime.Now;
            WebCache.Set(cacheItemKey, time, 1, false);
        }
    }
    <!DOCTYPE html>
    <html>
    <head>
        <title>WebCache Helper Sample</title>
    </head>
    <body>
        <div>
            @if (cacheHit) {
                @:Found the time data in the cache.
            } else {
                @:Did not find the time data in the cache.
            }
        </div>
        <div>
            This page was cached at @time.
        </div>
    </body>
    </html>
    

    데이터를 캐시할 때 웹 사이트에서 고유한 이름을 사용하여 캐시에 넣습니다. 이 경우 라는 CachedTime캐시 항목을 사용합니다. 코드 예제에 표시된 입니다 cacheItemKey .

    코드는 먼저 캐시 항목을 읽습니다 CachedTime . 값이 반환되면(즉, 캐시 항목이 null이 아닌 경우) 코드는 시간 변수 값을 캐시 데이터로 설정합니다.

    그러나 캐시 항목이 존재하지 않는 경우(즉, null) 코드는 시간 값을 설정하고 캐시에 추가하고 만료 값을 1분으로 설정합니다. 1분 후에 캐시 항목이 삭제됩니다. (캐시의 항목에 대한 기본 만료 값은 20분입니다.) 명령은 WebCache.Set(cacheItemKey, time, 1, false) 캐시에 현재 시간 값을 추가하고 만료를 1분으로 설정하는 방법을 보여 있습니다. slidingExpiration 매개 변수를 false 로 설정하면 만료 시간이 요청될 때마다 갱신되지 않습니다. 원래 캐시에 추가된 후 정확히 1분 후에 만료됩니다. 이 값을 true 1분 만료 시간으로 설정하면 캐시에서 값을 요청할 때마다 다시 설정됩니다.

    이 코드는 데이터를 캐시할 때 항상 사용해야 하는 패턴을 보여 줍니다. 캐시에서 항목을 가져오기 전에 항상 먼저 메서드가 null을 WebCache.Get 반환했는지 여부를 검사. 캐시 항목이 만료되었거나 다른 이유로 제거되었을 수 있으므로 지정된 항목이 캐시에 있다고 보장되지 않습니다.

  3. 브라우저에서 WebCache.cshtml 을 실행합니다. (실행하기 전에 파일 작업 영역에서 페이지가 선택되어 있는지 확인합니다.) 페이지를 처음 요청할 때 시간 데이터가 캐시에 없고 코드가 캐시에 시간 값을 추가해야 합니다.

    cache-1

  4. 브라우저에서 WebCache.cshtml 을 새로 고칩니다. 이번에는 시간 데이터가 캐시에 있습니다. 페이지를 마지막으로 본 이후의 시간은 변경되지 않았습니다.

    cache-2

  5. 캐시가 비워질 때까지 1분 정도 기다린 다음 페이지를 새로 고칩니다. 페이지는 캐시에서 시간 데이터를 찾을 수 없고 업데이트된 시간이 캐시에 추가되었음을 다시 나타냅니다.

추가 리소스