共用方式為


快取 ASP.NET Web Pages (Razor) 網站中的資料以提升效能

Tom FitzMacken

本文說明如何使用協助程式快取資訊,以加快 ASP.NET Web Pages (Razor) 網站的效能。 您可以藉由儲存通常需要相當長時間擷取或處理,且不常變更的資料結果 — 也就是快取,來加快您的網站速度

您將學到什麼:

  • 如何使用快取來改善網站的回應性。

以下是本文中介紹的 ASP.NET 功能:

  • WebCache 協助程式。

教學課程中使用的軟體版本

  • ASP.NET Web Pages (Razor) 3

本教學課程也適用於 ASP.NET Web Pages 2。

每次有人請求您網站中的網頁時,網頁伺服器必須執行一些工作,才能滿足請求。 針對您的部分網頁,伺服器可能必須執行花費 (相對) 較長時間的工作,例如從資料庫擷取資料。 即使這些工作在絕對層面上並不會花太多時間,但如果您的網站遇到大量流量,一系列導致網頁伺服器執行複雜或緩慢工作的個別請求可能就會增加許多工作。 這最終可能會影響網站的效能。

改善網站效能的方法之一,就是快取資料。 如果您的網站收到相同資訊的重複請求,而且該資訊不需要針對每個人修改,也沒有時間敏感性,無需重新擷取或重新計算的話,您可以只擷取資料一次,然後儲存結果。 下次請求傳入該資訊時,您只要將它從快取中取出即可。

一般而言,您會快取不會經常變更的資訊。 當您將資訊放入快取中時,它會儲存在網頁伺服器上的記憶體中。 您可以指定應該快取多久,從秒到數天。 快取期間到期時,會自動從快取中移除資訊。

注意

快取中的條目可能會因過期而被移除。 例如,Web 伺服器可能會暫時記憶體不足,而取回記憶體的其中一種方式是將條目從快取中移除。 如您所見,即使您已將資訊放入快取,您也必須檢查它是否在需要時仍存在。

假設您的網站有一個會顯示目前溫度和天氣預報的頁面。 若要取得這種類型的資訊,您可以傳送請求至外部服務。 由於此資訊不會變更太多 (例如,在兩小時的區段內),且因為外部呼叫需要時間和頻寬,因此就很適合使用快取。

新增快取至頁面

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),則程式碼會設定時間值、將它新增至快取,並將到期值設定為一分鐘。 一分鐘之後,就會捨棄快取條目。 (快取中項目的預設到期值為 20 分鐘。) 此命令 WebCache.Set(cacheItemKey, time, 1, false) 會示範如何將目前時間值新增至快取,並將其到期時間設定為 1 分鐘。 將 slidingExpiration 參數設定為 false 表示每次請求到期時間都不會展期。 它會在最初新增至快取之後的 1 分鐘到期。 如果您將此值設定為 true 1 分鐘的到期時間會在每次從快取請求該值時重設。

    此程式碼說明快取資料時應該一律使用的模式。 在您從快取中取得某些內容之前,請一律先檢查 WebCache.Get 方法是否傳回 Null。 請記住,快取條目可能已過期,或可能因為其他原因而被移除,因此絕對不能保證任何指定的條目位於快取中。

  3. 在瀏覽器中執行 WebCache.cshtml。 (在您執行前,要確定已在檔案工作區選取頁面。) 第一次請求頁面時,資料不在快取中,而且程式碼必須將時間值新增至快取。

    cache-1

  4. 在瀏覽器中重新整理 WebCache.cshtml。 這次,時間資料已經在快取中。 請注意,自從您上次檢視頁面後,時間並未變更。

    cache-2

  5. 等候一分鐘讓快取清空,然後重新整理頁面。 頁面會再次指出快取中找不到時間資料,且更新的時間會新增至快取。

其他資源