ASP.NET Core 中的快取概觀
注意
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
作者:Rick Anderson 與 Tom Dykstra
記憶體緩存
記憶體內部快取會使用伺服器記憶體來儲存快取的資料。 這種類型的快取適合使用會話親和性技術的單一伺服器或多部伺服器。 工作階段親和性也稱為黏性工作階段。 工作階段親和性 (session affinity) 代表來自客戶端的請求一律會路由至相同伺服器進行處理。
如需詳細資訊,請參閱 ASP.NET Core 中的記憶體內部快取和疑難排解 Azure 應用程式閘道工作階段親和性問題。
分散式快取
當應用程式裝載於雲端或伺服器陣列時,請使用分散式快取來儲存資料。 快取在處理要求的伺服器之間共享。 如果用戶端的快取資料可供使用,用戶端可以提交要求供群組中的任何伺服器處理。 ASP.NET Core 可搭配 SQL Server、Redis 和 NCache 分散式快取使用。
如需詳細資訊,請參閱 ASP.NET Core 中的分散式快取。
HybridCache
HybridCache API 會橋接 IDistributedCache 和 IMemoryCache API 中的一些間距。
HybridCache
是抽象類別,其預設實作會處理儲存至快取和從快取擷取的大部分層面。
功能
HybridCache
具有下列其他 API 沒有的功能:
適用於單一程序與跨程序快取的統一 API。
HybridCache
的設計目的是要取代現有的IDistributedCache
和IMemoryCache
使用方式,並提供簡單的 API 來新增快取程式碼。 如果應用程式具有IDistributedCache
實作,則HybridCache
服務會將其用於次要快取。 此雙層級快取策略可讓HybridCache
提供記憶體內部快取的速度,以及分散式或持續性快取的持久性。防止踩踏保護。
當經常使用的快取項目被撤銷,而太多要求嘗試同時重新填入相同的快取項目時,就會發生快取逃竄。
HybridCache
結合並行作業,可確保針對指定回應的所有要求都會等候第一個要求填入快取。可設定的序列化。
序列化被設定為服務註冊的一部分,並且透過從
AddHybridCache
呼叫鏈結的WithSerializer
和WithSerializerFactory
方法來支援類別特定和通用的序列化程式。 根據預設,服務會在內部處理string
和byte[]
,並針對其他所有項目使用System.Text.Json
。 可以針對其他類型的序列化程式進行設定,例如 protobuf 或 XML。
若要查看 HybridCache
API 的相對簡單性,請將使用它的程式碼與使用 IDistributedCache
的程式碼進行比較。 以下是使用 IDistributedCache
的呈現範例:
public class SomeService(IDistributedCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
var key = $"someinfo:{name}:{id}"; // Unique key for this combination.
var bytes = await cache.GetAsync(key, token); // Try to get from cache.
SomeInformation info;
if (bytes is null)
{
// Cache miss; get the data from the real source.
info = await SomeExpensiveOperationAsync(name, id, token);
// Serialize and cache it.
bytes = SomeSerializer.Serialize(info);
await cache.SetAsync(key, bytes, token);
}
else
{
// Cache hit; deserialize it.
info = SomeSerializer.Deserialize<SomeInformation>(bytes);
}
return info;
}
// This is the work we're trying to cache.
private async Task<SomeInformation> SomeExpensiveOperationAsync(string name, int id,
CancellationToken token = default)
{ /* ... */ }
}
每次都要做很多工作,包括序列化之類的事情。 在「快取遺漏」案例中,您最終可能會有多個並行執行緒、全部都有快取遺漏、全部都擷取基礎資料、全部序列化,以及全部將資料傳送至快取。
以下是使用 HybridCache
的對等程式碼:
public class SomeService(HybridCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
return await cache.GetOrCreateAsync(
$"someinfo:{name}:{id}", // Unique key for this entry.
async cancel => await SomeExpensiveOperationAsync(name, id, cancel),
token: token
);
}
}
程式碼更簡單,而且程式庫會提供戳記保護,以及 IDistributedCache
沒有的其他功能。
相容性
HybridCache
程式庫支援舊版 .NET 執行階段,向下至 .NET Framework 4.7.2 和 .NET Standard 2.0。
其他資源
如需詳細資訊,請參閱以下資源:
回應快取
回應快取中介軟體:
- 根據 HTTP 快取標頭啟用伺服器快取回應。 實作標準 HTTP 快取語意。 像代理伺服器一樣根據 HTTP 快取標頭進行快取。
- 通常對於 Razor Pages 這類 UI 應用程式並不具效益,因為瀏覽器通常會設定要求標頭,以防止快取。 輸出快取可在 ASP.NET Core 7.0 和更新版本中取得,對 UI 應用程式有益。 使用輸出快取時,設定會獨立於 HTTP 標頭決定哪些內容應被快取。
- 對於來自符合快取條件用戶端的公用 GET 或 HEAD API 要求可能會有幫助。
若要測試回應快取,請使用 Fiddler 或可明確設定要求標頭的其他工具。 明確設定標題是測試快取的最佳做法。 如需詳細資訊,請參閱疑難排解。
如需詳細資訊,請參閱 ASP.NET Core 中的回應快取。
輸出快取
輸出快取中介軟體可快取 HTTP 回應。 輸出快取與回應快取不同,在以下方面:
快取行為可在伺服器上設定。
回應快取行為是由 HTTP 標頭定義。 例如,當您使用 Chrome 或 Edge 瀏覽網站時,瀏覽器會自動傳送
Cache-control: max-age=0
標頭。 此標頭實際上會停用回應快取,因為伺服器會遵循用戶端所提供的指示。 即使伺服器有全新快取的回應,也會針對每個要求傳回新的回應。 使用輸出快取,用戶端不會覆寫您在伺服器上設定的快取行為。快取儲存媒體可延伸。
預設會使用記憶體。 回應快取僅限於記憶體。
您可以透過程式設計方式使選取的快取項目失效。
回應快取對 HTTP 標頭的相依性可讓您使用少數選項來使快取項目失效。
資源鎖定可降低快取暴衝和羊群效應的風險。
當經常使用的快取項目被撤銷,而太多要求嘗試同時重新填入相同的快取項目時,就會發生快取逃竄。 驚群效應類似:請求相同回應的流量激增,而該回應尚未存在於快取項目中。 資源鎖定可確保針對指定回應的所有要求都會等候第一個要求填入快取。 回應快取沒有資源鎖定功能。
快取重新驗證可將頻寬使用量降至最低。
快取重新驗證表示伺服器可以傳回
304 Not Modified
HTTP 狀態碼,而不是快取的回應本文。 此狀態碼會通知用戶端,對要求的回應與先前收到的回應沒有變更。 回應快取不會執行快取重新驗證。
如需詳細資訊,請參閱 ASP.NET Core 中的輸出快取中介軟體。
快取標籤協助程式
使用快取標籤協助程式來快取來自 MVC 檢視或 Razor Page 的內容。 快取標籤協助器使用記憶體快取來儲存資料。
如需詳細資訊,請參閱 ASP.NET Core MVC 中的快取標籤協助程式。
分散式快取標籤協助程式
使用分散式快取標籤輔助程式,在分散式雲端或 Web 伺服器陣列情境中,快取 MVC 視圖或 Razor Page 的內容。 分散式快取標籤協助程式會使用 SQL Server、Redis 或 NCache 來儲存資料。
如需詳細資訊,請參閱 ASP.NET Core 中的分散式快取標籤協助程式。
記憶體快取
記憶體內部快取會使用伺服器記憶體來儲存快取的資料。 使用工作階段親和性的單一伺服器或多部伺服器都適合這種類型的快取。 工作階段親和性也稱為黏性工作階段。 會話親和性表示來自用戶端的要求一律會路由至相同伺服器進行處理。
如需詳細資訊,請參閱 ASP.NET Core 中的記憶體內部快取和疑難排解 Azure 應用程式閘道工作階段親和性問題。
分散式快取
當應用程式裝載於雲端或伺服器陣列時,請使用分散式快取來儲存資料。 處理請求的伺服器之間會共用快取。 如果用戶端的快取資料可供使用,用戶端可以提交要求供群組中的任何伺服器處理。 ASP.NET Core 可搭配 SQL Server、Redis 和 NCache 分散式快取使用。
如需詳細資訊,請參閱 ASP.NET Core 中的分散式快取。
HybridCache
HybridCache API 會橋接 IDistributedCache 和 IMemoryCache API 中的一些間距。
HybridCache
是抽象類別,其預設實作會處理儲存至快取和從快取擷取的大部分層面。
功能
HybridCache
具有下列其他 API 沒有的功能:
適用於同處理序和跨處理序快取的統一 API。
HybridCache
的設計目的是要取代現有的IDistributedCache
和IMemoryCache
使用方式,並提供簡單的 API 來新增快取程式碼。 如果應用程式具有IDistributedCache
實作,則HybridCache
服務會將其用於次要快取。 此雙層級快取策略可讓HybridCache
提供記憶體內部快取的速度,以及分散式或持續性快取的持久性。戳記保護。
當經常使用的快取項目被撤銷,而太多要求嘗試同時重新填入相同的快取項目時,就會發生快取逃竄。
HybridCache
結合同時執行的操作,確保針對指定響應的所有請求都會等候第一個請求填入快取。可設定的序列化。
序列化設定為註冊服務的一部分,透過
WithSerializer
和WithSerializerFactory
方法從AddHybridCache
呼叫進行鏈結,支援類型特定和一般化序列化程式。 根據預設,服務會在內部處理string
和byte[]
,並針對其他所有項目使用System.Text.Json
。 可以針對其他類型的序列化程式進行設定,例如 protobuf 或 XML。
若要查看 HybridCache
API 的相對簡單性,請將使用它的程式碼與使用 IDistributedCache
的程式碼進行比較。 以下是使用 IDistributedCache
的呈現範例:
public class SomeService(IDistributedCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
var key = $"someinfo:{name}:{id}"; // Unique key for this combination.
var bytes = await cache.GetAsync(key, token); // Try to get from cache.
SomeInformation info;
if (bytes is null)
{
// Cache miss; get the data from the real source.
info = await SomeExpensiveOperationAsync(name, id, token);
// Serialize and cache it.
bytes = SomeSerializer.Serialize(info);
await cache.SetAsync(key, bytes, token);
}
else
{
// Cache hit; deserialize it.
info = SomeSerializer.Deserialize<SomeInformation>(bytes);
}
return info;
}
// This is the work we're trying to cache.
private async Task<SomeInformation> SomeExpensiveOperationAsync(string name, int id,
CancellationToken token = default)
{ /* ... */ }
}
每次都要花很多功夫來確保正確性,包括序列化之類的事情。 在「快取遺漏」案例中,您最終可能會有多個並行執行緒、全部都有快取遺漏、全部都擷取基礎資料、全部序列化,以及全部將資料傳送至快取。
以下是使用 HybridCache
的對等程式碼:
public class SomeService(HybridCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
return await cache.GetOrCreateAsync(
$"someinfo:{name}:{id}", // Unique key for this entry.
async cancel => await SomeExpensiveOperationAsync(name, id, cancel),
token: token
);
}
}
程式碼更簡單,程式庫提供流量暴增保護和其他是 IDistributedCache
不具備的功能。
相容性
HybridCache
程式庫支援舊版 .NET 執行階段,向下至 .NET Framework 4.7.2 和 .NET Standard 2.0。
其他資源
如需詳細資訊,請參閱以下資源:
快取標籤協助程式
使用快取標籤協助程式,從 MVC 檢視或 Razor 頁面來快取內容。 快取標籤協助程式會使用記憶體內部快取來儲存資料。
如需詳細資訊,請參閱 ASP.NET Core MVC 中的快取標籤協助程式。
分散式快取標籤協助程式
使用分散式快取標籤輔助程式,在分散式雲端或 Web 伺服器陣列場景中,快取來自 MVC 檢視或 Razor Page 的內容。 分散式快取標籤協助程式會使用 SQL Server、Redis 或 NCache 來儲存資料。
如需詳細資訊,請參閱 ASP.NET Core 中的分散式快取標籤協助程式。
回應快取
回應快取中介軟體:
- 根據 HTTP 快取標頭啟用快取伺服器回應。 實作標準 HTTP 快取語意。 根據 Proxy 之類的 HTTP 快取標頭快取。
- 通常對於 Razor Pages 等 UI 應用程式無益,因為瀏覽器通常會設置要求標頭以阻止快取。 輸出快取可在 ASP.NET Core 7.0 和更新版本中取得,對 UI 應用程式有益。 當使用輸出快取時,設定會決定應該快取什麼,且無需依賴 HTTP 標頭。
- 對於來自符合快取條件用戶端的公用 GET 或 HEAD API 要求可能會有幫助。
若要測試回應快取,請使用 Fiddler 或可明確設定要求標頭的其他工具。 明確設定標頭是測試快取的慣用方式。 如需詳細資訊,請參閱疑難排解。
輸出快取
輸出快取中介軟體執行 HTTP 回應的快取。 輸出快取與回應快取不同,在以下方面:
快取行為可在伺服器上設定。
回應快取行為是由 HTTP 標頭定義。 例如,當您使用 Chrome 或 Edge 瀏覽網站時,瀏覽器會自動傳送
Cache-control: max-age=0
標頭。 此標頭實際上會停用回應快取,因為伺服器會遵循用戶端所提供的指示。 即使伺服器有全新快取的回應,也會針對每個要求傳回新的回應。 使用輸出快取時,用戶端不會覆蓋您在伺服器上設定的快取行為。快取儲存媒體可延伸。
預設會使用記憶體。 回應快取僅限於記憶體。
您可以透過程式設計方式使選取的快取項目失效。
回應快取對 HTTP 標頭的相依性可讓您使用少數選項來使快取項目失效。
資源鎖定可降低逃竄和驚群問題的風險。
當經常使用的快取項目被撤銷,而太多要求嘗試同時重新填入相同的快取項目時,就會發生快取逃竄。 驚群問題類似:對於尚未在快取紀錄中的相同回應,出現大量突如其來的請求。 資源鎖定機制可確保對於指定回應的所有要求都會等候第一個要求填入快取。 回應快取沒有資源鎖定功能。
快取重新驗證可將頻寬使用量降至最低。
快取重新驗證表示伺服器可以傳回
304 Not Modified
HTTP 狀態碼,而不是快取的回應本文。 此狀態碼會通知用戶端,對要求的回應與先前收到的回應沒有變更。 回應快取不會執行快取重新驗證。
記憶體快取
記憶體內部快取會使用伺服器記憶體來儲存快取的資料。 這種類型的快取適合使用工作階段親和性的單一伺服器或多部伺服器。 工作階段黏著性也稱為黏性工作階段。 工作階段黏附性表示來自用戶端的請求總是會路由至相同的伺服器進行處理。
如需詳細資訊,請參閱 ASP.NET Core 中的記憶體內部快取,和疑難排解 Azure 應用程式閘道工作階段親和性問題。
分散式快取
當應用程式裝載於雲端或伺服器陣列時,請使用分散式快取來儲存資料。 快取在處理請求的伺服器之間共享。 如果用戶端的快取資料可供使用,用戶端可以提交要求供群組中的任何伺服器處理。 ASP.NET Core 可搭配 SQL Server、Redis 和 NCache 分散式快取使用。
如需詳細資訊,請參閱 ASP.NET Core 中的分散式快取。
HybridCache
HybridCache API 會橋接 IDistributedCache 和 IMemoryCache API 中的一些間距。
HybridCache
是抽象類別,其預設實作會處理儲存至快取和從快取擷取的大部分層面。
功能
HybridCache
具有下列其他 API 沒有的功能:
用於同一處理序和跨處理序快取的統一 API。
HybridCache
的設計目的是要取代現有的IDistributedCache
和IMemoryCache
使用方式,並提供簡單的 API 來新增快取程式碼。 如果應用程式具有IDistributedCache
實作,則HybridCache
服務會將其用於次要快取。 此雙層級快取策略可讓HybridCache
提供記憶體內部快取的速度,以及分散式或持續性快取的持久性。戳記保護。
當經常使用的快取項目被撤銷,而太多要求嘗試同時重新填入相同的快取項目時,就會發生快取逃竄。
HybridCache
結合並行作業,可確保針對指定回應的所有要求都會等候第一個要求填入快取。可設定的序列化。
序列化設定為註冊服務的一部分,透過
WithSerializer
和WithSerializerFactory
方法從AddHybridCache
呼叫進行鏈結,支援類型特定和一般化序列化程式。 根據預設,服務會在內部處理string
和byte[]
,並針對其他所有項目使用System.Text.Json
。 可以針對其他類型的序列化程式進行設定,例如 protobuf 或 XML。
若要查看 HybridCache
API 的相對簡單性,請將使用它的程式碼與使用 IDistributedCache
的程式碼進行比較。 以下是使用 IDistributedCache
的呈現範例:
public class SomeService(IDistributedCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
var key = $"someinfo:{name}:{id}"; // Unique key for this combination.
var bytes = await cache.GetAsync(key, token); // Try to get from cache.
SomeInformation info;
if (bytes is null)
{
// Cache miss; get the data from the real source.
info = await SomeExpensiveOperationAsync(name, id, token);
// Serialize and cache it.
bytes = SomeSerializer.Serialize(info);
await cache.SetAsync(key, bytes, token);
}
else
{
// Cache hit; deserialize it.
info = SomeSerializer.Deserialize<SomeInformation>(bytes);
}
return info;
}
// This is the work we're trying to cache.
private async Task<SomeInformation> SomeExpensiveOperationAsync(string name, int id,
CancellationToken token = default)
{ /* ... */ }
}
要做好每次的工作,包括序列化之類的事情,需要付出不少努力。 在「快取遺漏」案例中,您最終可能會有多個並行執行緒、全部都有快取遺漏、全部都擷取基礎資料、全部序列化,以及全部將資料傳送至快取。
以下是使用 HybridCache
的對等程式碼:
public class SomeService(HybridCache cache)
{
public async Task<SomeInformation> GetSomeInformationAsync
(string name, int id, CancellationToken token = default)
{
return await cache.GetOrCreateAsync(
$"someinfo:{name}:{id}", // Unique key for this entry.
async cancel => await SomeExpensiveOperationAsync(name, id, cancel),
token: token
);
}
}
程式碼更簡單,而且程式庫會提供高負載保護,以及 IDistributedCache
沒有的其他功能。
相容性
HybridCache
程式庫支援舊版 .NET 執行階段,向下至 .NET Framework 4.7.2 和 .NET Standard 2.0。
其他資源
如需詳細資訊,請參閱以下資源:
快取標籤協助程式
使用快取標籤協助工具快取 MVC 檢視或 Razor Page 的內容。 快取標籤輔助程式利用內部記憶體快取來儲存資料。
如需詳細資訊,請參閱 ASP.NET Core MVC 中的快取標籤協助程式。
分散式快取標籤輔助程式
在分散式雲端或 Web 伺服器陣列場景中,使用分散式快取標籤輔助程式來快取 MVC 檢視或 Razor Page 的內容。 分散式快取標籤協助程式會使用 SQL Server、Redis 或 NCache 來儲存資料。
如需詳細資訊,請參閱 ASP.NET Core 中的分散式快取標籤協助程式。
回應緩存
回應快取機制中介軟體:
- 根據 HTTP 快取標頭啟用伺服器的回應快取。 實作標準 HTTP 快取語意。 根據 HTTP 快取標頭進行快取,類似於代理伺服器的操作。
- 通常對 Razor Pages 之類的 UI 應用程式並沒有好處,因為瀏覽器通常會設定要求標頭,導致無法快取。 輸出快取可在 ASP.NET Core 7.0 和更新版本中取得,對 UI 應用程式有益。 設定輸出快取時,可以獨立於 HTTP 標頭決定應該快取哪些內容。
- 對於來自符合快取條件用戶端的公用 GET 或 HEAD API 要求可能會有幫助。
若要測試回應快取,請使用 Fiddler 或可明確設定要求標頭的其他工具。 明確設定標題是測試快取的慣用方式。 如需詳細資訊,請參閱疑難排解。
輸出緩存
輸出快取可在 .NET 7 和更新版本中取得。