Aracılığıyla paylaş


ASP.NET Core'da önbelleğe alma anlayışı

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Tarafından Rick Anderson ve Tom Dykstra

Bellek içi önbellek

Bellek içi önbelleğe alma, önbelleğe alınmış verileri depolamak için sunucu belleğini kullanır. Bu önbelleğe alma türü, oturum benzimi kullanan tek bir sunucu veya birden çok sunucu için uygundur. Oturum bağlılığı, yapışkan oturumlar olarak da bilinir. Oturum benzimi, bir istemciden gelen isteklerin her zaman işlenmek üzere aynı sunucuya yönlendirildiğini gösterir.

Daha fazla bilgi için, ASP.NET Core'da bellek içi önbelleğe alma ve Azure Application Gateway oturum bağlılığı sorunlarını giderme sayfalarına bakın.

Dağıtılmış Önbellek

Uygulama bir bulutta veya sunucu grubunda barındırıldığında verileri depolamak için dağıtılmış önbellek kullanın. Önbellek, istekleri işleyen sunucular arasında paylaşılır. İstemci için önbelleğe alınmış veriler varsa, istemci gruptaki herhangi bir sunucu tarafından işlenen bir istek gönderebilir. ASP.NET Core, SQL Server, Redis, Postgres ve NCache dağıtılmış önbellekleriyle çalışır.

Daha fazla bilgi için bkz . ASP.NET Core'da dağıtılmış önbelleğe alma.

HybridCache

HybridCache API, IDistributedCache ve IMemoryCache API'lerindeki bazı boşlukları doldurur. HybridCache , önbelleğe kaydetme ve önbellekten alma işlemlerinin çoğu yönünü işleyen varsayılan bir uygulamaya sahip soyut bir sınıftır.

Özellikler

HybridCache diğer API'lerin sahip olmadığı aşağıdaki özelliklere sahiptir:

  • Hem işlem içi hem de işlem dışı önbelleğe alma için birleşik bir API.

    HybridCache mevcut IDistributedCache ve IMemoryCache kullanımının doğrudan değiştirilebilir bir yedeği olarak tasarlanmıştır ve yeni önbelleğe alma kodu eklemek için basit bir API sağlar. Uygulamanın bir IDistributedCache uygulaması varsa, HybridCache hizmet bunu ikincil önbelleğe alma için kullanır. Bu iki düzeyli önbelleğe alma stratejisi, bellek içi önbelleğin hızını ve dağıtılmış veya kalıcı önbelleğin dayanıklılığını sağlar HybridCache .

  • Damgalı koruma.

    Sık kullanılan bir önbellek girdisi iptal edildiğinde ve çok fazla istek aynı önbellek girdisini aynı anda yeniden doldurmaya çalıştığında önbellek damgalama işlemi gerçekleşir. HybridCache eşzamanlı işlemleri birleştirerek belirli bir yanıta yönelik tüm isteklerin önbelleği doldurmak için ilk isteği beklemesini sağlar.

  • Yapılandırılabilir serileştirme.

    Serileştirme, WithSerializer çağrısından zincirlenen WithSerializerFactory ve AddHybridCache yöntemleri aracılığıyla türüne özgü ve genelleştirilmiş serileştiriciler desteğiyle hizmet kaydının bir parçası olarak yapılandırılır. Varsayılan olarak, hizmet string ve byte[] öğelerini dahili olarak işler ve diğer her şey için System.Text.Json kullanır. Protobuf veya XML gibi diğer serileştirici türleri için yapılandırılabilir.

HybridCache API'sinin göreli basitliğini görmek için, bu API'yi kullanan kodu IDistributedCache API'sini kullanan kodla karşılaştırın. İşte IDistributedCache kullanımının nasıl göründüğüne dair bir örnek:

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)
    { /* ... */ }
}

Serileştirme gibi şeyler de dahil olmak üzere her seferinde doğru olanı yapmak için çok fazla çalışma gerekir. "Önbellek hatası" senaryosunda birden çok eşzamanlı iş parçacığıyla karşılaşabilir, hepsi önbellek hatası alabilir, temel verileri getirebilir, bunları seri hale getirebilir ve bu verileri önbelleğe gönderebilirler.

İşte HybridCache kullanarak eşdeğer bir kod:

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
        );
    }
}

Kod daha basittir ve kitaplık IDistributedCache sağlamadığı aşırı yük koruması ve diğer özellikleri sağlar.

Uyumluluk

Kitaplık HybridCache , .NET Framework 4.7.2 ve .NET Standard 2.0'a kadar eski .NET çalışma zamanlarını destekler.

Ek kaynaklar

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Yanıtları Önbelleğe Alma

Yanıt önbelleğe alma ara yazılımı:

  • HTTP önbellek üst bilgilerine göre sunucu yanıtlarını önbelleğe almayı etkinleştirir. Standart HTTP önbelleğe alma semantiğini uygular. Proxy sunucular gibi HTTP önbellek üst bilgilerine dayanan önbellekler.
  • Tarayıcılar genellikle önbelleğe almayı engelleyen istek üst bilgilerini ayarladığından, Sayfalar gibi Razor kullanıcı arabirimi uygulamaları için genellikle yararlı olmaz. .NET 7 veya sonraki sürümlerde kullanılabilen çıktı önbelleğe alma, kullanıcı arabirimi uygulamalarından yararlanır. Çıkış önbelleğe alma ile yapılandırma, HTTP üst bilgilerinden bağımsız olarak nelerin önbelleğe alınması gerektiğine karar verir.
  • Önbelleğe alma koşullarının karşılandığı istemcilerden gelen genel GET veya HEAD API istekleri için yararlı olabilir.

Yanıt önbelleğe almayı test etmek için Fiddler'ı veya istek üst bilgilerini açıkça ayarlayabilen başka bir aracı kullanın. Üst bilgileri açıkça ayarlamak, önbelleğe alma testi için tercih edilir. Daha fazla bilgi için bkz. Sorun giderme.

Daha fazla bilgi için bkz . ASP.NET Core'da yanıt önbelleğe alma.

Çıkış verisi önbellekleme

Çıkış önbelleğe alma ara yazılımı, HTTP yanıtlarının önbelleğe alınmasını sağlar. Çıktı önbelleğe alma, yanıt önbelleğe alma ile karşılaştırıldığında aşağıdaki şekillerde farklılık gösterir:

  • Önbelleğe alma davranışı sunucuda yapılandırılabilir.

    Yanıt önbelleğe alma davranışı HTTP üst bilgileri tarafından tanımlanır. Örneğin, Chrome veya Edge ile bir web sitesini ziyaret ettiğinizde tarayıcı otomatik olarak bir Cache-control: max-age=0 üst bilgi gönderir. Bu başlık, sunucu istemci tarafından sağlanan yönergeleri izlediğinden yanıt önbelleğe almayı etkili bir şekilde devre dışı bırakır. Sunucuda yeni bir önbelleğe alınmış yanıt olsa bile her istek için yeni bir yanıt döndürülür. Çıkış önbelleğe alma işlemiyle istemci, sunucuda yapılandırdığınız önbelleğe alma davranışını geçersiz kılmaz.

  • Önbellek depolama ortamı genişletilebilir.

    Bellek varsayılan olarak kullanılır. Yanıt önbelleğe alma işlemi bellekle sınırlıdır.

  • Seçili önbellek girdilerini program aracılığıyla geçersiz kılabilirsiniz.

    Yanıt önbelleğe alma işleminin HTTP üst bilgilerine bağımlılığı, önbellek girdilerini geçersiz hale getirmeniz için birkaç seçenek sunar.

  • Kaynak kilitleme, önbellek yığılması ve sürü saldırısı riskini azaltır.

    Sık kullanılan bir önbellek girdisi iptal edildiğinde ve çok fazla istek aynı önbellek girdisini aynı anda yeniden doldurmaya çalıştığında önbellek damgalama işlemi gerçekleşir. Kalabalık patlaması benzerdir: önbelleğe alınmamış aynı yanıt için ani istek patlaması. Kaynak kilitleme, belirli bir yanıta yönelik tüm isteklerin önbelleği doldurmak için ilk isteği beklemesini sağlar. Yanıt önbelleğe alma işleminin kaynak kilitleme özelliği yoktur.

  • Önbellek yeniden doğrulama bant genişliği kullanımını en aza indirir.

    Önbellek yeniden doğrulama , sunucunun önbelleğe alınmış yanıt gövdesi yerine http 304 Not Modified durum kodu döndürebileceği anlamına gelir. Bu durum kodu, istemciye isteğin yanıtının daha önce alınan yanıttan değişmediğini bildirir. Yanıt önbelleğe alma, önbellek geçerliliğini yeniden kontrol etme işlemi yapmaz.

Daha fazla bilgi için bkz . ASP.NET Core'da çıktı önbelleğe alma ara yazılımı.

Önbellek Etiketi Yardımcısı

İçeriği, Önbellek Etiketi Yardımcısı ile bir MVC görünümünden veya Razor Sayfasından önbelleğe alın. Önbellek Etiketi Yardımcısı, verileri depolamak için bellek içi önbelleğe alma kullanır.

Daha fazla bilgi için bkz . ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı.

Dağıtılmış Önbellek Etiketi Yardımcısı

Dağıtılmış Önbellek Etiketi Yardımcısı ile dağıtılmış bulut veya Razor web çiftliği senaryolarındaki bir MVC görünümünden veya sayfasından içeriği önbelleğe alın. Dağıtılmış Önbellek Etiketi Yardımcısı, verileri depolamak için SQL Server, Redis veya NCache kullanır.

Daha fazla bilgi için bkz . ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı.

Bellek içi önbellek

Bellek içi önbelleğe alma, önbelleğe alınmış verileri depolamak için sunucu belleğini kullanır. Bu önbelleğe alma türü, oturum benzimi kullanan tek bir sunucu veya birden çok sunucu için uygundur. Oturum bağlılığı, yapışkan oturumlar olarak da bilinir. Oturum benzimi, bir istemciden gelen isteklerin her zaman işlenmek üzere aynı sunucuya yönlendirildiğini gösterir.

Daha fazla bilgi için, ASP.NET Core'da bellek içi önbelleğe alma ve Azure Application Gateway oturum bağlılığı sorunlarını giderme sayfalarına bakın.

Dağıtılmış Önbellek

Uygulama bir bulutta veya sunucu grubunda barındırıldığında verileri depolamak için dağıtılmış önbellek kullanın. Önbellek, istekleri işleyen sunucular arasında paylaşılır. İstemci için önbelleğe alınmış veriler varsa, istemci gruptaki herhangi bir sunucu tarafından işlenen bir istek gönderebilir. ASP.NET Core, SQL Server, Redis, Postgres ve NCache dağıtılmış önbellekleriyle çalışır.

Daha fazla bilgi için bkz . ASP.NET Core'da dağıtılmış önbelleğe alma.

HybridCache

HybridCache API, IDistributedCache ve IMemoryCache API'lerindeki bazı boşlukları doldurur. HybridCache , önbelleğe kaydetme ve önbellekten alma işlemlerinin çoğu yönünü işleyen varsayılan bir uygulamaya sahip soyut bir sınıftır.

Özellikler

HybridCache diğer API'lerin sahip olmadığı aşağıdaki özelliklere sahiptir:

  • Hem işlem içi hem de işlem dışı önbelleğe alma için birleşik bir API.

    HybridCache mevcut IDistributedCache ve IMemoryCache kullanımının doğrudan değiştirilebilir bir yedeği olarak tasarlanmıştır ve yeni önbelleğe alma kodu eklemek için basit bir API sağlar. Uygulamanın bir IDistributedCache uygulaması varsa, HybridCache hizmet bunu ikincil önbelleğe alma için kullanır. Bu iki düzeyli önbelleğe alma stratejisi, bellek içi önbelleğin hızını ve dağıtılmış veya kalıcı önbelleğin dayanıklılığını sağlar HybridCache .

  • Damgalı koruma.

    Sık kullanılan bir önbellek girdisi iptal edildiğinde ve çok fazla istek aynı önbellek girdisini aynı anda yeniden doldurmaya çalıştığında önbellek damgalama işlemi gerçekleşir. HybridCache eşzamanlı işlemleri birleştirerek belirli bir yanıta yönelik tüm isteklerin önbelleği doldurmak için ilk isteği beklemesini sağlar.

  • Yapılandırılabilir serileştirme.

    Serileştirme, WithSerializer çağrısından zincirlenen WithSerializerFactory ve AddHybridCache yöntemleri aracılığıyla türüne özgü ve genelleştirilmiş serileştiriciler desteğiyle hizmet kaydının bir parçası olarak yapılandırılır. Varsayılan olarak, hizmet string ve byte[] öğelerini dahili olarak işler ve diğer her şey için System.Text.Json kullanır. Protobuf veya XML gibi diğer serileştirici türleri için yapılandırılabilir.

HybridCache API'sinin göreli basitliğini görmek için, bu API'yi kullanan kodu IDistributedCache API'sini kullanan kodla karşılaştırın. İşte IDistributedCache kullanımının nasıl göründüğüne dair bir örnek:

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)
    { /* ... */ }
}

Serileştirme gibi şeyler de dahil olmak üzere her seferinde doğru olanı yapmak için çok fazla çalışma gerekir. "Önbellek hatası" senaryosunda birden çok eşzamanlı iş parçacığıyla karşılaşabilir, hepsi önbellek hatası alabilir, temel verileri getirebilir, bunları seri hale getirebilir ve bu verileri önbelleğe gönderebilirler.

İşte HybridCache kullanarak eşdeğer bir kod:

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
        );
    }
}

Kod daha basittir ve kitaplık IDistributedCache sağlamadığı aşırı yük koruması ve diğer özellikleri sağlar.

Uyumluluk

Kitaplık HybridCache , .NET Framework 4.7.2 ve .NET Standard 2.0'a kadar eski .NET çalışma zamanlarını destekler.

Ek kaynaklar

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Önbellek Etiketi Yardımcısı

İçeriği, Önbellek Etiketi Yardımcısı ile bir MVC görünümünden veya Razor Sayfasından önbelleğe alın. Önbellek Etiketi Yardımcısı, verileri depolamak için bellek içi önbelleğe alma kullanır.

Daha fazla bilgi için bkz . ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı.

Dağıtılmış Önbellek Etiketi Yardımcısı

Dağıtılmış Önbellek Etiketi Yardımcısı ile dağıtılmış bulut veya Razor web çiftliği senaryolarındaki bir MVC görünümünden veya sayfasından içeriği önbelleğe alın. Dağıtılmış Önbellek Etiketi Yardımcısı, verileri depolamak için SQL Server, Redis veya NCache kullanır.

Daha fazla bilgi için bkz . ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı.

Yanıtları Önbelleğe Alma

Yanıt önbelleğe alma ara yazılımı:

  • HTTP önbellek üst bilgilerine göre sunucu yanıtlarını önbelleğe almayı etkinleştirir. Standart HTTP önbelleğe alma semantiğini uygular. Proxy sunucular gibi HTTP önbellek üst bilgilerine dayanan önbellekler.
  • Tarayıcılar genellikle önbelleğe almayı engelleyen istek üst bilgilerini ayarladığından, Sayfalar gibi Razor kullanıcı arabirimi uygulamaları için genellikle yararlı olmaz. .NET 7 veya sonraki sürümlerde kullanılabilen çıktı önbelleğe alma, kullanıcı arabirimi uygulamalarından yararlanır. Çıkış önbelleğe alma ile yapılandırma, HTTP üst bilgilerinden bağımsız olarak nelerin önbelleğe alınması gerektiğine karar verir.
  • Önbelleğe alma koşullarının karşılandığı istemcilerden gelen genel GET veya HEAD API istekleri için yararlı olabilir.

Yanıt önbelleğe almayı test etmek için Fiddler'ı veya istek üst bilgilerini açıkça ayarlayabilen başka bir aracı kullanın. Üst bilgileri açıkça ayarlamak, önbelleğe alma testi için tercih edilir. Daha fazla bilgi için bkz. Sorun giderme.

Çıkış verisi önbellekleme

Çıkış önbelleğe alma ara yazılımı, HTTP yanıtlarının önbelleğe alınmasını sağlar. Çıktı önbelleğe alma, yanıt önbelleğe alma ile karşılaştırıldığında aşağıdaki şekillerde farklılık gösterir:

  • Önbelleğe alma davranışı sunucuda yapılandırılabilir.

    Yanıt önbelleğe alma davranışı HTTP üst bilgileri tarafından tanımlanır. Örneğin, Chrome veya Edge ile bir web sitesini ziyaret ettiğinizde tarayıcı otomatik olarak bir Cache-control: max-age=0 üst bilgi gönderir. Bu başlık, sunucu istemci tarafından sağlanan yönergeleri izlediğinden yanıt önbelleğe almayı etkili bir şekilde devre dışı bırakır. Sunucuda yeni bir önbelleğe alınmış yanıt olsa bile her istek için yeni bir yanıt döndürülür. Çıkış önbelleğe alma işlemiyle istemci, sunucuda yapılandırdığınız önbelleğe alma davranışını geçersiz kılmaz.

  • Önbellek depolama ortamı genişletilebilir.

    Bellek varsayılan olarak kullanılır. Yanıt önbelleğe alma işlemi bellekle sınırlıdır.

  • Seçili önbellek girdilerini program aracılığıyla geçersiz kılabilirsiniz.

    Yanıt önbelleğe alma işleminin HTTP üst bilgilerine bağımlılığı, önbellek girdilerini geçersiz hale getirmeniz için birkaç seçenek sunar.

  • Kaynak kilitleme, önbellek yığılması ve sürü saldırısı riskini azaltır.

    Sık kullanılan bir önbellek girdisi iptal edildiğinde ve çok fazla istek aynı önbellek girdisini aynı anda yeniden doldurmaya çalıştığında önbellek damgalama işlemi gerçekleşir. Kalabalık patlaması benzerdir: önbelleğe alınmamış aynı yanıt için ani istek patlaması. Kaynak kilitleme, belirli bir yanıta yönelik tüm isteklerin önbelleği doldurmak için ilk isteği beklemesini sağlar. Yanıt önbelleğe alma işleminin kaynak kilitleme özelliği yoktur.

  • Önbellek yeniden doğrulama bant genişliği kullanımını en aza indirir.

    Önbellek yeniden doğrulama , sunucunun önbelleğe alınmış yanıt gövdesi yerine http 304 Not Modified durum kodu döndürebileceği anlamına gelir. Bu durum kodu, istemciye isteğin yanıtının daha önce alınan yanıttan değişmediğini bildirir. Yanıt önbelleğe alma, önbellek geçerliliğini yeniden kontrol etme işlemi yapmaz.

Bellek içi önbellek

Bellek içi önbelleğe alma, önbelleğe alınmış verileri depolamak için sunucu belleğini kullanır. Bu önbelleğe alma türü, oturum benzimi kullanan tek bir sunucu veya birden çok sunucu için uygundur. Oturum bağlılığı, yapışkan oturumlar olarak da bilinir. Oturum benzimi, bir istemciden gelen isteklerin her zaman işlenmek üzere aynı sunucuya yönlendirildiğini gösterir.

Daha fazla bilgi için, ASP.NET Core'da bellek içi önbelleğe alma ve Azure Application Gateway oturum bağlılığı sorunlarını giderme sayfalarına bakın.

Dağıtılmış Önbellek

Uygulama bir bulutta veya sunucu grubunda barındırıldığında verileri depolamak için dağıtılmış önbellek kullanın. Önbellek, istekleri işleyen sunucular arasında paylaşılır. İstemci için önbelleğe alınmış veriler varsa, istemci gruptaki herhangi bir sunucu tarafından işlenen bir istek gönderebilir. ASP.NET Core, SQL Server, Redis, Postgres ve NCache dağıtılmış önbellekleriyle çalışır.

Daha fazla bilgi için bkz . ASP.NET Core'da dağıtılmış önbelleğe alma.

HybridCache

HybridCache API, IDistributedCache ve IMemoryCache API'lerindeki bazı boşlukları doldurur. HybridCache , önbelleğe kaydetme ve önbellekten alma işlemlerinin çoğu yönünü işleyen varsayılan bir uygulamaya sahip soyut bir sınıftır.

Özellikler

HybridCache diğer API'lerin sahip olmadığı aşağıdaki özelliklere sahiptir:

  • Hem işlem içi hem de işlem dışı önbelleğe alma için birleşik bir API.

    HybridCache mevcut IDistributedCache ve IMemoryCache kullanımının doğrudan değiştirilebilir bir yedeği olarak tasarlanmıştır ve yeni önbelleğe alma kodu eklemek için basit bir API sağlar. Uygulamanın bir IDistributedCache uygulaması varsa, HybridCache hizmet bunu ikincil önbelleğe alma için kullanır. Bu iki düzeyli önbelleğe alma stratejisi, bellek içi önbelleğin hızını ve dağıtılmış veya kalıcı önbelleğin dayanıklılığını sağlar HybridCache .

  • Damgalı koruma.

    Sık kullanılan bir önbellek girdisi iptal edildiğinde ve çok fazla istek aynı önbellek girdisini aynı anda yeniden doldurmaya çalıştığında önbellek damgalama işlemi gerçekleşir. HybridCache eşzamanlı işlemleri birleştirerek belirli bir yanıta yönelik tüm isteklerin önbelleği doldurmak için ilk isteği beklemesini sağlar.

  • Yapılandırılabilir serileştirme.

    Serileştirme, WithSerializer çağrısından zincirlenen WithSerializerFactory ve AddHybridCache yöntemleri aracılığıyla türüne özgü ve genelleştirilmiş serileştiriciler desteğiyle hizmet kaydının bir parçası olarak yapılandırılır. Varsayılan olarak, hizmet string ve byte[] öğelerini dahili olarak işler ve diğer her şey için System.Text.Json kullanır. Protobuf veya XML gibi diğer serileştirici türleri için yapılandırılabilir.

HybridCache API'sinin göreli basitliğini görmek için, bu API'yi kullanan kodu IDistributedCache API'sini kullanan kodla karşılaştırın. İşte IDistributedCache kullanımının nasıl göründüğüne dair bir örnek:

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)
    { /* ... */ }
}

Serileştirme gibi şeyler de dahil olmak üzere her seferinde doğru olanı yapmak için çok fazla çalışma gerekir. "Önbellek hatası" senaryosunda birden çok eşzamanlı iş parçacığıyla karşılaşabilir, hepsi önbellek hatası alabilir, temel verileri getirebilir, bunları seri hale getirebilir ve bu verileri önbelleğe gönderebilirler.

İşte HybridCache kullanarak eşdeğer bir kod:

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
        );
    }
}

Kod daha basittir ve kitaplık IDistributedCache sağlamadığı aşırı yük koruması ve diğer özellikleri sağlar.

Uyumluluk

Kitaplık HybridCache , .NET Framework 4.7.2 ve .NET Standard 2.0'a kadar eski .NET çalışma zamanlarını destekler.

Ek kaynaklar

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Önbellek Etiketi Yardımcısı

İçeriği, Önbellek Etiketi Yardımcısı ile bir MVC görünümünden veya Razor Sayfasından önbelleğe alın. Önbellek Etiketi Yardımcısı, verileri depolamak için bellek içi önbelleğe alma kullanır.

Daha fazla bilgi için bkz . ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı.

Dağıtılmış Önbellek Etiketi Yardımcısı

Dağıtılmış Önbellek Etiketi Yardımcısı ile dağıtılmış bulut veya Razor web çiftliği senaryolarındaki bir MVC görünümünden veya sayfasından içeriği önbelleğe alın. Dağıtılmış Önbellek Etiketi Yardımcısı, verileri depolamak için SQL Server, Redis veya NCache kullanır.

Daha fazla bilgi için bkz . ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı.

Yanıtları Önbelleğe Alma

Yanıt önbelleğe alma ara yazılımı:

  • HTTP önbellek üst bilgilerine göre sunucu yanıtlarını önbelleğe almayı etkinleştirir. Standart HTTP önbelleğe alma semantiğini uygular. Proxy sunucular gibi HTTP önbellek üst bilgilerine dayanan önbellekler.
  • Tarayıcılar genellikle önbelleğe almayı engelleyen istek üst bilgilerini ayarladığından, Sayfalar gibi Razor kullanıcı arabirimi uygulamaları için genellikle yararlı olmaz. .NET 7 veya sonraki sürümlerde kullanılabilen çıktı önbelleğe alma, kullanıcı arabirimi uygulamalarından yararlanır. Çıkış önbelleğe alma ile yapılandırma, HTTP üst bilgilerinden bağımsız olarak nelerin önbelleğe alınması gerektiğine karar verir.
  • Önbelleğe alma koşullarının karşılandığı istemcilerden gelen genel GET veya HEAD API istekleri için yararlı olabilir.

Yanıt önbelleğe almayı test etmek için Fiddler'ı veya istek üst bilgilerini açıkça ayarlayabilen başka bir aracı kullanın. Üst bilgileri açıkça ayarlamak, önbelleğe alma testi için tercih edilir. Daha fazla bilgi için bkz. Sorun giderme.

Çıkış verisi önbellekleme

Çıktı önbelleğe alma .NET 7 veya sonraki sürümlerde kullanılabilir.