Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 10-Version dieses Artikels.
Warnung
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der .NET- und .NET Core-Supportrichtlinie. Die aktuelle Version finden Sie in der .NET 10-Version dieses Artikels.
Von Rick Anderson und Tom Dykstra
Dieser Artikel bietet eine Übersicht über das Zwischenspeichern in ASP.NET Core mit einer Einführung zum Zwischenspeichern im Arbeitsspeicher, zum verteilten, hybriden, Antwort- und Ausgabezwischenspeichern.
In-Memory-Caching
Die In-Memory-Zwischenspeicherung nutzt den Serverarbeitsspeicher, um zwischengespeicherte Daten zu speichern. Diese Art der Zwischenspeicherung eignet sich für einen einzelnen Server oder mehrere Server, die Sitzungsaffinität verwenden. Die Sitzungsaffinität wird auch als Sticky Sessions bezeichnet. Sitzungsaffinität bedeutet, dass die Anforderungen von einem Client immer an denselben Server zur Verarbeitung weitergeleitet werden.
Weitere Informationen finden Sie unter In-Memory-Zwischenspeicherung in ASP.NET Core und unter Behandeln von Problemen mit der Azure Application Gateway-Sitzungsaffinität.
Verteilter Cache
Verwenden Sie einen verteilten Cache, um Daten zu speichern, wenn die App in einer Cloud oder Serverfarm gehostet wird. Der Cache wird von den Servern, die Anforderungen verarbeiten, gemeinsam genutzt. Ein Client kann eine Anforderung senden, die von jedem Server in der Gruppe verarbeitet wird, wenn zwischengespeicherte Daten für den Client verfügbar sind. ASP.NET Core arbeitet mit verteilten Caches von SQL Server, Redis, Postgres und NCache zusammen.
Weitere Informationen finden Sie unter Verteiltes Zwischenspeichern in ASP.NET Core.
HybridCache
Die HybridCache API überbrückt Lücken in den IDistributedCache und IMemoryCache APIs.
HybridCache ist eine abstrakte Klasse mit einer Standardimplementierung, welche die meisten Aspekte des Speicherns im Cache und abrufen aus dem Cache behandelt.
Features von HybridCache
HybridCache stellt die folgenden Features bereit, die nicht mit anderen APIs verfügbar sind:
Eine einheitliche API für prozessinternes und prozessübergreifendes Caching.
HybridCacheist als Drop-In-Ersatz für vorhandeneIDistributedCache- undIMemoryCache-Nutzung konzipiert und bietet eine einfache API zum Hinzufügen von neuem Zwischenspeicherungscode. Wenn die App über eineIDistributedCache-Implementierung verfügt, verwendet derHybridCache-Dienst sie für die sekundäre Zwischenspeicherung. Diese zweistufige Zwischenspeicherungsstrategie ermöglichtHybridCachedie Geschwindigkeit eines Speichercaches und die Haltbarkeit eines verteilten oder persistenten Caches.Stampede-Schutz.
Cache Stampede tritt auf, wenn ein häufig verwendeter Cacheeintrag widerrufen wird und zu viele Anforderungen versuchen, denselben Cacheeintrag gleichzeitig neu aufzufüllen.
HybridCachekombiniert gleichzeitige Vorgänge, wodurch sichergestellt wird, dass alle Anforderungen für eine bestimmte Antwort auf die erste Anforderung warten, um den Cache aufzufüllen.Konfigurierbare Serialisierung.
Die Serialisierung wird als Teil der Registrierung des Diensts konfiguriert, wobei typspezifische und generalisierte Serialisierer über die
WithSerializer- undWithSerializerFactory-Methoden, verkettet vomAddHybridCache-Aufruf, unterstützt werden. Der Dienst verarbeitetstringundbyte[]standardmäßig intern und verwendetSystem.Text.Jsonals Namespace für alles andere.HybridCachekann für andere Typen von Serialisierern konfiguriert werden, z. B. Protobuf oder XML.
Um die relative Einfachheit der HybridCache-API anzuzeigen, vergleichen Sie Code, den sie verwendet, mit Code, der IDistributedCache verwendet. Hier sehen Sie ein Beispiel dafür, wie die Verwendung von IDistributedCache aussieht:
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)
{ /* ... */ }
}
Der Code veranschaulicht eine erhebliche Menge an Arbeit, um jedes Mal richtig zu sein, einschließlich Dinge wie Serialisierung. Auch im Szenario eines "Cache-Fehlzugriffs" kann es passieren, dass Sie mit mehreren gleichzeitigen Threads enden. Diese Threads könnten alle einen Cache-Miss erhalten, alle die zugrunde liegenden Daten abrufen, alle sie serialisieren und alle die Daten an den Cache senden.
Hier sehen Sie den entsprechenden Code, der die HybridCache API verwendet:
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
);
}
}
Der Code ist einfacher, und die Bibliothek bietet Überlastungsschutz und andere Funktionen, die nicht mit der IDistributedCache Schnittstelle verfügbar sind.
Kompatibilität
Die HybridCache-Bibliothek unterstützt ältere .NET Laufzeiten, einschließlich .NET Framework 4.7.2 und .NET Standard 2.0.
Weitere Informationen
Weitere Informationen finden Sie in den folgenden Ressourcen:
- HybridCache-Bibliothek in ASP.NET Core
- Hybrid Cache API proposal (GitHub dotnet/aspnetcore issue #54647)
- HybridCache-Quellcode
Zwischenspeichern von Antworten
Die Antwort-Caching-Middleware ermöglicht das Zwischenspeichern von Serverantworten basierend auf HTTP-Cache-Control-Headern.
Das Zwischenspeicherungsverhalten implementiert standardmäßige HTTP-Zwischenspeicherungsemantik.
Das Zwischenspeichern basiert auf HTTP-Cacheheadern, die der von Proxys verwendeten Methode ähneln.
Diese Form der Zwischenspeicherung ist nützlich für öffentliche GET- oder HEAD-API-Anforderungen von Clients, bei denen die Bedingungen für die Zwischenspeicherung erfüllt sind.
Für UI-Apps wie Razor Seiten ist das Zwischenspeichern von Antworten in der Regel nicht von Vorteil. Browser legen häufig Anforderungsheader fest, die das Zwischenspeichern verhindern.
Output caching (verfügbar in .NET 7 und höher) ist ein besserer Ansatz für UI-Apps. In diesem Szenario bestimmt die Konfiguration, was unabhängig von HTTP-Headern zwischengespeichert werden soll.
Um das Zwischenspeichern von Antworten zu testen, verwenden Sie Fiddler oder ein anderes Tool, das Anforderungsheader explizit festlegen kann. Beim Testen der Zwischenspeicherung wird das explizite Festlegen von Headern bevorzugt. Weitere Informationen finden Sie unter "Problembehandlung bei der Zwischenspeicherung von Reaktions-Middleware > ".
Weitere Informationen finden Sie unter Zwischenspeichern von Antworten in ASP.NET Core.
Ausgabezwischenspeicherung
Die Middleware für die Ausgabezwischenspeicherung ermöglicht das Zwischenspeichern von HTTP-Antworten. Die Ausgabezwischenspeicherung unterscheidet sich auf folgende Weise vom Zwischenspeichern von Antworten:
Das Zwischenspeicherungsverhalten kann auf dem Server konfiguriert werden.
Das Verhalten der Antwortzwischenspeicherung wird mit HTTP-Headern definiert. Wenn Sie beispielsweise eine Website mit Chrome oder Microsoft Edge durchsuchen, sendet der Browser automatisch einen
Cache-control: max-age=0Header. Dieser Header deaktiviert effektiv das Zwischenspeichern von Antworten, da der Server den vom Client bereitgestellten Anweisungen folgt. Für jede Anforderung wird auch dann eine neue Antwort zurückgegeben, wenn der Server über eine aktuelle zwischengespeicherte Antwort verfügt. Bei der Ausgabezwischenspeicherung überschreibt der Client nicht das Zwischenspeicherungsverhalten, das Sie auf dem Server konfigurieren.Das Cachespeichermedium ist erweiterbar.
Der Arbeitsspeicher wird standardmäßig verwendet. Die Antwortzwischenspeicherung ist auf den Arbeitsspeicher beschränkt.
Sie können ausgewählte Cacheeinträge programmgesteuert als ungültig festlegen.
Die Antwortzwischenspeicherung ist von HTTP-Headern abhängig, wodurch Ihnen nur wenige Optionen zum Ungültigmachen von Cache-Einträgen bleiben.
Die Ressourcensperrung verringert das Risiko von Cache Stampede und Thundering Herd Problem.
Cache Stampede tritt auf, wenn ein häufig verwendeter Cacheeintrag widerrufen wird und zu viele Anforderungen versuchen, denselben Cacheeintrag gleichzeitig neu aufzufüllen. Thundering Herd ist ähnlich: eine Flut von Anforderungen für dieselbe Antwort, die sich noch nicht in einem Cacheeintrag befindet. Die Ressourcensperre sorgt dafür, dass alle Anforderungen für eine bestimmte Antwort auf die erste Anforderung warten, um den Cache zu füllen. Die Antwortzwischenspeicherung verfügt über kein Feature zum Sperren von Ressourcen.
Die erneute Cacheüberprüfung minimiert die Bandbreitennutzung.
Die Cache-Neuvalidierung bedeutet, dass der Server anstelle eines zwischengespeicherten Antworttexts einen 304 Nicht geänderten HTTP-Statuscode zurückgeben kann. Dieser Statuscode informiert den Client darüber, dass die Antwort auf die Anforderung mit der zuvor empfangenen Antwort identisch ist. Bei der Antwortzwischenspeicherung wird keine erneute Cacheüberprüfung durchgeführt.
Weitere Informationen finden Sie unter Ausgabezwischenspeicherungs-Middleware in ASP.NET Core.
Cache-Taghilfsprogramm
Speichern Sie den Inhalt aus einer MVC-Ansicht oder einer Razor Page-Instanz mit dem Cache-Taghilfsprogramm zwischen. Das Cache-Taghilfsprogramm verwendet die In-Memory-Zwischenspeicherung zum Speichern von Daten.
Weitere Informationen finden Sie unter Cache-Taghilfsprogramm im ASP.NET Core MVC.
Taghilfsprogramm für verteilten Cache
Speichern Sie den Inhalt aus einer MVC-Ansicht oder einer Razor Page-Instanz in verteilten Cloud- oder Webfarmszenarien mit dem Taghilfsprogramm für verteilten Cache zwischen. Das Taghilfsprogramm für verteilten Cache verwendet SQL Server, Redis oder NCache zum Speichern von Daten.
Weitere Informationen finden Sie unter Taghilfsprogramm für verteilten Cache in ASP.NET Core.
In-Memory-Caching
Die In-Memory-Zwischenspeicherung nutzt den Serverarbeitsspeicher, um zwischengespeicherte Daten zu speichern. Diese Art des Zwischenspeicherns eignet sich für einen einzelnen Server oder für mehrere Server mit Sitzungsaffinität. Die Sitzungsaffinität wird auch als Sticky Sessions bezeichnet. Sitzungsaffinität bedeutet, dass die Anforderungen von einem Client immer an denselben Server zur Verarbeitung weitergeleitet werden.
Weitere Informationen finden Sie unter In-Memory-Zwischenspeicherung in ASP.NET Core und unter Behandeln von Problemen mit der Azure Application Gateway-Sitzungsaffinität.
Verteilter Cache
Verwenden Sie einen verteilten Cache, um Daten zu speichern, wenn die App in einer Cloud oder Serverfarm gehostet wird. Der Cache wird von den Servern, die Anforderungen verarbeiten, gemeinsam genutzt. Ein Client kann eine Anforderung übermitteln, die von einem beliebigen Server in der Gruppe verarbeitet wird, wenn zwischengespeicherte Daten für den Client verfügbar sind. ASP.NET Core arbeitet mit SQL Server-, Redis-, Postgres- und NCache-verteilten Caches zusammen.
Weitere Informationen finden Sie unter Verteiltes Zwischenspeichern in ASP.NET Core.
HybridCache
Die HybridCache API überbrückt Lücken in den IDistributedCache und IMemoryCache APIs.
HybridCache ist eine abstrakte Klasse mit einer Standardimplementierung, welche die meisten Aspekte des Speicherns im Cache und abrufen aus dem Cache behandelt.
Features von HybridCache
HybridCache stellt die folgenden Features bereit, die nicht mit anderen APIs verfügbar sind:
Eine einheitliche API für prozessinternes und prozessübergreifendes Caching.
HybridCacheist als Drop-In-Ersatz für vorhandeneIDistributedCache- undIMemoryCache-Nutzung konzipiert und bietet eine einfache API zum Hinzufügen von neuem Zwischenspeicherungscode. Wenn die App über eineIDistributedCache-Implementierung verfügt, verwendet derHybridCache-Dienst sie für die sekundäre Zwischenspeicherung. Diese zweistufige Zwischenspeicherungsstrategie ermöglichtHybridCachedie Geschwindigkeit eines Speichercaches und die Haltbarkeit eines verteilten oder persistenten Caches.Stampede-Schutz.
Cache Stampede tritt auf, wenn ein häufig verwendeter Cacheeintrag widerrufen wird und zu viele Anforderungen versuchen, denselben Cacheeintrag gleichzeitig neu aufzufüllen.
HybridCachekombiniert gleichzeitige Vorgänge, wodurch sichergestellt wird, dass alle Anforderungen für eine bestimmte Antwort auf die erste Anforderung warten, um den Cache aufzufüllen.Konfigurierbare Serialisierung.
Die Serialisierung wird als Teil der Registrierung des Diensts konfiguriert, wobei typspezifische und generalisierte Serialisierer über die
WithSerializer- undWithSerializerFactory-Methoden, verkettet vomAddHybridCache-Aufruf, unterstützt werden. Standardmäßig verarbeitet der Dienst die Typenstringundbyte[]intern und verwendet denSystem.Text.JsonNamespace für alles andere.HybridCachekann für andere Typen von Serialisierern konfiguriert werden, z. B. Protobuf oder XML.
Um die relative Einfachheit der HybridCache-API anzuzeigen, vergleichen Sie Code, den sie verwendet, mit Code, der IDistributedCache verwendet. Hier sehen Sie ein Beispiel dafür, wie die Verwendung von IDistributedCache aussieht:
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)
{ /* ... */ }
}
Der Code veranschaulicht eine erhebliche Menge an Arbeit, um jedes Mal richtig zu sein, einschließlich Dinge wie Serialisierung. Auch im Szenario "Cache-Miss" könnten Sie am Ende mit mehreren gleichzeitigen Threads dastehen. Diese Threads könnten alle einen Cache-Miss erleben, alle die zugrunde liegenden Daten abrufen, alle diese serialisieren und alle die Daten an den Cache senden.
Hier sehen Sie den entsprechenden Code, der die HybridCache API verwendet:
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
);
}
}
Der Code ist einfacher, und die Bibliothek bietet Sturmflut-Schutz und andere Funktionen, die mit der IDistributedCache Schnittstelle nicht verfügbar sind.
Kompatibilität
Die HybridCache-Bibliothek unterstützt ältere .NET Laufzeiten, einschließlich .NET Framework 4.7.2 und .NET Standard 2.0.
Weitere Informationen
Weitere Informationen finden Sie in den folgenden Ressourcen:
- HybridCache-Bibliothek in ASP.NET Core
- Hybrid Cache API proposal (GitHub dotnet/aspnetcore issue #54647)
- HybridCache-Quellcode
Cache-Taghilfsprogramm
Speichern Sie den Inhalt aus einer MVC-Ansicht oder einer Razor Page-Instanz mit dem Cache-Taghilfsprogramm zwischen. Das Cache-Taghilfsprogramm verwendet die In-Memory-Zwischenspeicherung zum Speichern von Daten.
Weitere Informationen finden Sie unter Cache-Taghilfsprogramm im ASP.NET Core MVC.
Taghilfsprogramm für verteilten Cache
Speichern Sie den Inhalt aus einer MVC-Ansicht oder einer Razor Page-Instanz in verteilten Cloud- oder Webfarmszenarien mit dem Taghilfsprogramm für verteilten Cache zwischen. Das Taghilfsprogramm für verteilten Cache verwendet SQL Server, Redis oder NCache zum Speichern von Daten.
Weitere Informationen finden Sie unter Taghilfsprogramm für verteilten Cache in ASP.NET Core.
Zwischenspeichern von Antworten
Die Antwort-Caching-Middleware ermöglicht das Zwischenspeichern von Serverantworten basierend auf HTTP-Cache-Control-Headern.
Das Zwischenspeicherungsverhalten implementiert standardmäßige HTTP-Zwischenspeicherungsemantik.
Das Zwischenspeichern basiert auf HTTP-Cacheheadern, die der von Proxys verwendeten Methode ähneln.
Diese Form der Zwischenspeicherung ist nützlich für öffentliche GET- oder HEAD-API-Anforderungen von Clients, bei denen die Bedingungen für die Zwischenspeicherung erfüllt sind.
Für UI-Apps wie Razor Seiten ist das Zwischenspeichern von Antworten in der Regel nicht von Vorteil. Browser legen häufig Anforderungsheader fest, die das Zwischenspeichern verhindern.
Output caching (verfügbar in .NET 7 und höher) ist ein besserer Ansatz für UI-Apps. In diesem Szenario bestimmt die Konfiguration, was unabhängig von HTTP-Headern zwischengespeichert werden soll.
Um das Zwischenspeichern von Antworten zu testen, verwenden Sie Fiddler oder ein anderes Tool, das Anforderungsheader explizit festlegen kann. Beim Testen der Zwischenspeicherung wird das explizite Festlegen von Headern bevorzugt. Weitere Informationen finden Sie unter "Problembehandlung bei der Zwischenspeicherung von Reaktions-Middleware > ".
Ausgabezwischenspeicherung
Die Middleware für die Ausgabezwischenspeicherung ermöglicht das Zwischenspeichern von HTTP-Antworten. Die Ausgabezwischenspeicherung unterscheidet sich auf folgende Weise vom Zwischenspeichern von Antworten:
Das Zwischenspeicherungsverhalten kann auf dem Server konfiguriert werden.
Das Verhalten der Antwortzwischenspeicherung wird durch HTTP-Header definiert. Wenn Sie beispielsweise eine Website über Chrome oder Edge besuchen, sendet der Browser automatisch einen
Cache-control: max-age=0-Header. Dieser Header deaktiviert effektiv die Antwortzwischenspeicherung, da der Server die vom Client angegebenen Anweisungen befolgt. Für jede Anforderung wird auch dann eine neue Antwort zurückgegeben, wenn der Server über eine aktuelle zwischengespeicherte Antwort verfügt. Bei der Ausgabezwischenspeicherung überschreibt der Client nicht das Zwischenspeicherungsverhalten, das Sie auf dem Server konfigurieren.Das Cachespeichermedium ist erweiterbar.
Der Arbeitsspeicher wird standardmäßig verwendet. Die Antwortzwischenspeicherung ist auf den Arbeitsspeicher beschränkt.
Sie können ausgewählte Cacheeinträge programmgesteuert als ungültig festlegen.
Die Abhängigkeit der Antwortzwischenspeicherung von HTTP-Headern lässt Ihnen nur wenige Optionen zum Aufheben der Gültigkeit von Cacheeinträgen.
Die Ressourcensperrung verringert das Risiko von Cache Stampede und Thundering Herd Problem.
Cache Stampede tritt auf, wenn ein häufig verwendeter Cacheeintrag widerrufen wird und zu viele Anforderungen versuchen, denselben Cacheeintrag gleichzeitig neu aufzufüllen. Thundering Herd ist ähnlich: eine Flut von Anforderungen für dieselbe Antwort, die sich noch nicht in einem Cacheeintrag befindet. Die Ressourcensperre sorgt dafür, dass alle Anforderungen für eine bestimmte Antwort auf die erste Anforderung warten, um den Cache zu füllen. Die Antwortzwischenspeicherung verfügt über kein Feature zum Sperren von Ressourcen.
Die erneute Cacheüberprüfung minimiert die Bandbreitennutzung.
Erneute Cacheüberprüfung bedeutet, dass der Server anstelle eines zwischengespeicherten Antworttexts einen
304 Not Modified-HTTP-Statuscode zurückgeben kann. Dieser Statuscode informiert den Client darüber, dass die Antwort auf die Anforderung mit der zuvor empfangenen Antwort identisch ist. Bei der Antwortzwischenspeicherung wird keine erneute Cacheüberprüfung durchgeführt.
In-Memory-Caching
Die In-Memory-Zwischenspeicherung nutzt den Serverarbeitsspeicher, um zwischengespeicherte Daten zu speichern. Diese Art des Zwischenspeicherns eignet sich für einen einzelnen Server oder für mehrere Server mit Sitzungsaffinität. Die Sitzungsaffinität wird auch als Sticky Sessions bezeichnet. Sitzungsaffinität bedeutet, dass die Anforderungen von einem Client immer an denselben Server zur Verarbeitung weitergeleitet werden.
Weitere Informationen finden Sie unter In-Memory-Zwischenspeicherung in ASP.NET Core und unter Behandeln von Problemen mit der Azure Application Gateway-Sitzungsaffinität.
Verteilter Cache
Verwenden Sie einen verteilten Cache, um Daten zu speichern, wenn die App in einer Cloud oder Serverfarm gehostet wird. Der Cache wird von den Servern, die Anforderungen verarbeiten, gemeinsam genutzt. Ein Client kann eine Anforderung übermitteln, die von einem beliebigen Server in der Gruppe verarbeitet wird, wenn zwischengespeicherte Daten für den Client verfügbar sind. ASP.NET Core arbeitet mit verteilten SQL Server-, Redis, Postgres und NCache Caches zusammen.
Weitere Informationen finden Sie unter Verteiltes Zwischenspeichern in ASP.NET Core.
HybridCache
Die HybridCache API überbrückt Lücken in den IDistributedCache und IMemoryCache APIs.
HybridCache ist eine abstrakte Klasse mit einer Standardimplementierung, welche die meisten Aspekte des Speicherns im Cache und abrufen aus dem Cache behandelt.
Features von HybridCache
HybridCache stellt die folgenden Features bereit, die nicht mit anderen APIs verfügbar sind:
Eine einheitliche API für prozessinternes und prozessübergreifendes Caching.
HybridCacheist als Drop-In-Ersatz für vorhandeneIDistributedCache- undIMemoryCache-Nutzung konzipiert und bietet eine einfache API zum Hinzufügen von neuem Zwischenspeicherungscode. Wenn die App über eineIDistributedCache-Implementierung verfügt, verwendet derHybridCache-Dienst sie für die sekundäre Zwischenspeicherung. Diese zweistufige Zwischenspeicherungsstrategie ermöglichtHybridCachedie Geschwindigkeit eines Speichercaches und die Haltbarkeit eines verteilten oder persistenten Caches.Stampede-Schutz.
Cache Stampede tritt auf, wenn ein häufig verwendeter Cacheeintrag widerrufen wird und zu viele Anforderungen versuchen, denselben Cacheeintrag gleichzeitig neu aufzufüllen.
HybridCachekombiniert gleichzeitige Vorgänge, wodurch sichergestellt wird, dass alle Anforderungen für eine bestimmte Antwort auf die erste Anforderung warten, um den Cache aufzufüllen.Konfigurierbare Serialisierung.
Die Serialisierung wird als Teil der Registrierung des Diensts konfiguriert, wobei typspezifische und generalisierte Serialisierer über die
WithSerializer- undWithSerializerFactory-Methoden, verkettet vomAddHybridCache-Aufruf, unterstützt werden. Standardmäßig verarbeitet der Dienststring- undbyte[]-Typen intern und verwendet denSystem.Text.Json-Namespace für alles andere.HybridCachekann für andere Typen von Serialisierern konfiguriert werden, z. B. Protobuf oder XML.
Um die relative Einfachheit der HybridCache-API anzuzeigen, vergleichen Sie Code, den sie verwendet, mit Code, der IDistributedCache verwendet. Hier sehen Sie ein Beispiel dafür, wie die Verwendung von IDistributedCache aussieht:
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)
{ /* ... */ }
}
Der Code veranschaulicht eine erhebliche Menge an Arbeit, um jedes Mal richtig zu sein, einschließlich Dinge wie Serialisierung. Auch im Szenario "Cache-Miss" kann es zu mehreren gleichzeitigen Threads kommen. Diese Threads können alle einen Cachefehler erhalten, alle die zugrunde liegenden Daten abrufen, sie alle serialisieren und alle die Daten an den Cache senden.
Hier sehen Sie den entsprechenden Code, der die HybridCache API verwendet:
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
);
}
}
Der Code ist einfacher, und die Bibliothek bietet Stampede-Schutz und andere Funktionen, die nicht mit der IDistributedCache Schnittstelle verfügbar sind.
Kompatibilität
Die HybridCache-Bibliothek unterstützt ältere .NET Laufzeiten, einschließlich .NET Framework 4.7.2 und .NET Standard 2.0.
Weitere Informationen
Weitere Informationen finden Sie in den folgenden Ressourcen:
- HybridCache-Bibliothek in ASP.NET Core
- Hybrid Cache API proposal (GitHub dotnet/aspnetcore issue #54647)
- HybridCache-Quellcode
Cache-Taghilfsprogramm
Speichern Sie den Inhalt aus einer MVC-Ansicht oder einer Razor Page-Instanz mit dem Cache-Taghilfsprogramm zwischen. Das Cache-Taghilfsprogramm verwendet die In-Memory-Zwischenspeicherung zum Speichern von Daten.
Weitere Informationen finden Sie unter Cache-Taghilfsprogramm im ASP.NET Core MVC.
Taghilfsprogramm für verteilten Cache
Speichern Sie den Inhalt aus einer MVC-Ansicht oder einer Razor Page-Instanz in verteilten Cloud- oder Webfarmszenarien mit dem Taghilfsprogramm für verteilten Cache zwischen. Das Taghilfsprogramm für verteilten Cache verwendet SQL Server, Redis oder NCache zum Speichern von Daten.
Weitere Informationen finden Sie unter Taghilfsprogramm für verteilten Cache in ASP.NET Core.
Zwischenspeichern von Antworten
Die Antwort-Caching-Middleware ermöglicht das Zwischenspeichern von Serverantworten basierend auf HTTP-Cache-Control-Headern.
Das Zwischenspeicherungsverhalten implementiert standardmäßige HTTP-Zwischenspeicherungsemantik.
Das Zwischenspeichern basiert auf HTTP-Cacheheadern, die der von Proxys verwendeten Methode ähneln.
Diese Form der Zwischenspeicherung ist nützlich für öffentliche GET- oder HEAD-API-Anforderungen von Clients, bei denen die Bedingungen für die Zwischenspeicherung erfüllt sind.
Für UI-Apps wie Razor Seiten ist das Zwischenspeichern von Antworten in der Regel nicht von Vorteil. Browser legen häufig Anforderungsheader fest, die das Zwischenspeichern verhindern.
Output caching (verfügbar in .NET 7 und höher) ist ein besserer Ansatz für UI-Apps. In diesem Szenario bestimmt die Konfiguration, was unabhängig von HTTP-Headern zwischengespeichert werden soll.
Um das Zwischenspeichern von Antworten zu testen, verwenden Sie Fiddler oder ein anderes Tool, das Anforderungsheader explizit festlegen kann. Beim Testen der Zwischenspeicherung wird das explizite Festlegen von Headern bevorzugt. Weitere Informationen finden Sie unter "Problembehandlung bei der Zwischenspeicherung von Reaktions-Middleware > ".
Ausgabezwischenspeicherung
Die Ausgabezwischenspeicherung ist in .NET 7 oder höher verfügbar.