Übersicht über die Zwischenspeicherung in ASP.NET Core

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.

    HybridCache ist als Drop-In-Ersatz für vorhandene IDistributedCache- und IMemoryCache-Nutzung konzipiert und bietet eine einfache API zum Hinzufügen von neuem Zwischenspeicherungscode. Wenn die App über eine IDistributedCache-Implementierung verfügt, verwendet der HybridCache-Dienst sie für die sekundäre Zwischenspeicherung. Diese zweistufige Zwischenspeicherungsstrategie ermöglicht HybridCache die 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. HybridCache kombiniert 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- und WithSerializerFactory-Methoden, verkettet vom AddHybridCache-Aufruf, unterstützt werden. Der Dienst verarbeitet string und byte[] standardmäßig intern und verwendet System.Text.Json als Namespace für alles andere. HybridCache kann 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:

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=0 Header. 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.

    HybridCache ist als Drop-In-Ersatz für vorhandene IDistributedCache- und IMemoryCache-Nutzung konzipiert und bietet eine einfache API zum Hinzufügen von neuem Zwischenspeicherungscode. Wenn die App über eine IDistributedCache-Implementierung verfügt, verwendet der HybridCache-Dienst sie für die sekundäre Zwischenspeicherung. Diese zweistufige Zwischenspeicherungsstrategie ermöglicht HybridCache die 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. HybridCache kombiniert 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- und WithSerializerFactory-Methoden, verkettet vom AddHybridCache-Aufruf, unterstützt werden. Standardmäßig verarbeitet der Dienst die Typen string und byte[] intern und verwendet den System.Text.Json Namespace für alles andere. HybridCache kann 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:

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.

    HybridCache ist als Drop-In-Ersatz für vorhandene IDistributedCache- und IMemoryCache-Nutzung konzipiert und bietet eine einfache API zum Hinzufügen von neuem Zwischenspeicherungscode. Wenn die App über eine IDistributedCache-Implementierung verfügt, verwendet der HybridCache-Dienst sie für die sekundäre Zwischenspeicherung. Diese zweistufige Zwischenspeicherungsstrategie ermöglicht HybridCache die 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. HybridCache kombiniert 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- und WithSerializerFactory-Methoden, verkettet vom AddHybridCache-Aufruf, unterstützt werden. Standardmäßig verarbeitet der Dienst string- und byte[]-Typen intern und verwendet den System.Text.Json-Namespace für alles andere. HybridCache kann 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:

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.