快取 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. 等候一分鐘快取清空,然後重新整理頁面。 頁面再次指出快取中找不到時間資料,並將更新的時間新增至快取。

其他資源