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

Tarafından Mohsin Nasir and smandia

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 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 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Dağıtılmış önbellek, birden çok uygulama sunucusu tarafından paylaşılan ve genellikle bu sunucuya erişen uygulama sunucularında dış hizmet olarak tutulan bir önbellektir. Dağıtılmış önbellek, özellikle uygulama bir bulut hizmeti veya sunucu grubu tarafından barındırıldığında ASP.NET Core uygulamasının performansını ve ölçeklenebilirliğini iyileştirebilir.

Dağıtılmış önbellek, önbelleğe alınan verilerin tek tek uygulama sunucularında depolandığı diğer önbelleğe alma senaryolarına göre çeşitli avantajlara sahiptir.

Önbelleğe alınan veriler dağıtıldığında, veriler:

  • Birden çok sunucuya yönelik istekler arasında tutarlı (tutarlı).
  • Sunucu yeniden başlatmalarını ve uygulama dağıtımlarını sürdürmektedir.
  • Yerel bellek kullanmaz.

Dağıtılmış önbellek yapılandırması uygulamaya özgüdür. Bu makalede SQL Server ve Redis dağıtılmış önbelleklerinin nasıl yapılandırıldığı açıklanmaktadır. NCache (GitHub'da NCache) gibi üçüncü taraf uygulamaları da kullanılabilir. Hangi uygulamanın seçildiğinden bağımsız olarak, uygulama arabirimini kullanarak önbellekle etkileşim kurar IDistributedCache .

Örnek kodu görüntüleme veya indirme (indirme)

Uyarı

Bu makalede, kullanıcının kimliğinin doğrulanması gerekmeyen bir yerel veritabanı kullanılır. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Dağıtılan test ve üretim uygulamaları için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

Önkoşullar

Kullanılan dağıtılmış önbellek sağlayıcısı için paket başvurusu ekleyin:

IDistributedCache arabirimi

Arabirim, IDistributedCache dağıtılmış önbellek uygulamasındaki öğeleri işlemek için aşağıdaki yöntemleri sağlar:

  • Get, GetAsync: Bir dize anahtarını kabul eder ve önbellekte bulunursa önbelleğe alınmış bir byte[] öğeyi dizi olarak alır.
  • Set, SetAsync: Dize anahtarı kullanarak önbelleğe bir öğe (dizi olarak byte[] ) ekler.
  • Refresh, RefreshAsync: Önbellekteki bir öğeyi anahtarına göre yeniler ve kayan süre sonu zaman aşımını (varsa) sıfırlar.
  • Remove, RemoveAsync: Bir önbellek öğesini dize anahtarına göre kaldırır.

Dağıtılmış önbelleğe alma hizmetleri oluşturma

uygulamasını IDistributedCache içinde Program.cskaydedin. Bu konuda açıklanan çerçeve tarafından sağlanan uygulamalar şunlardır:

Dağıtılmış Redis Önbelleği

Üretim uygulamalarının Dağıtılmış Redis Önbelleği'ni kullanmasını öneririz, çünkü en yüksek performansa olanak sağlar. Daha fazla bilgi için bkz . Öneriler.

Redis, genellikle dağıtılmış önbellek olarak kullanılan açık kaynak bellek içi veri deposudur. Azure tarafından barındırılan bir ASP.NET Core uygulaması için Redis için Azure Cache yapılandırabilir ve yerel geliştirme için bir Redis için Azure Cache kullanabilirsiniz.

Bir uygulama, çağrısı AddStackExchangeRedisCacheyaparak bir RedisCache örneği kullanarak önbellek uygulamasını yapılandırır. Çıktı önbelleğe alma için kullanın AddStackExchangeRedisOutputCache.

  1. bir Redis için Azure Cache oluşturun.
  2. Birincil bağlantı dizesi (StackExchange.Redis) Yapılandırma'ya kopyalayın.

Aşağıdaki kod Redis için Azure Cache etkinleştirir:

builder.Services.AddStackExchangeRedisCache(options =>
 {
     options.Configuration = builder.Configuration.GetConnectionString("MyRedisConStr");
     options.InstanceName = "SampleInstance";
 });

Yukarıdaki kodda Birincil bağlantı dizesi (StackExchange.Redis) anahtar adıyla MyRedisConStryapılandırmaya kaydedildiği varsayılır.

Daha fazla bilgi için bkz. Redis için Azure Cache.

Yerel Redis önbelleğine yönelik alternatif yaklaşımlar hakkında bir tartışma için bu GitHub sorununa bakın.

Dağıtılmış Bellek Önbelleği

Dağıtılmış Bellek Önbelleği (AddDistributedMemoryCache), öğeleri bellekte depolayan çerçeve tarafından sağlanan bir uygulamadır IDistributedCache . Dağıtılmış Bellek Önbelleği gerçek bir dağıtılmış önbellek değildir. Önbelleğe alınan öğeler, uygulamanın çalıştığı sunucudaki uygulama örneği tarafından depolanır.

Dağıtılmış Bellek Önbelleği yararlı bir uygulamadır:

  • Geliştirme ve test senaryolarında.
  • Üretimde tek bir sunucu kullanıldığında ve bellek tüketimi sorun olmadığında. Dağıtılmış Bellek Önbelleğinin uygulanması önbelleğe alınan veri depolamayı soyutlar. Gelecekte birden çok düğüm veya hataya dayanıklılık gerekli hale gelirse gerçek bir dağıtılmış önbelleğe alma çözümü uygulamaya olanak tanır.

Örnek uygulama, içindeki Geliştirme ortamında çalıştırıldığında Dağıtılmış Bellek Önbelleği'ni Program.cskullanır:

builder.Services.AddDistributedMemoryCache();

Dağıtılmış SQL Server Önbelleği

Dağıtılmış SQL Server Önbelleği uygulaması (AddDistributedSqlServerCache), dağıtılmış önbelleğin bir SQL Server veritabanını yedekleme deposu olarak kullanmasına izin verir. BIR SQL Server örneğinde SQL Server önbelleğe alınmış bir öğe tablosu oluşturmak için aracı kullanabilirsiniz sql-cache . Araç, belirttiğiniz ada ve şemaya sahip bir tablo oluşturur.

komutunu çalıştırarak sql-cache create SQL Server'da bir tablo oluşturun. SQL Server örneğini (), veritabanını (Data SourceInitial Catalog), şemasını (örneğin, dbo) ve tablo adını (örneğin, TestCache):

dotnet sql-cache create "Data Source=(localdb)/MSSQLLocalDB;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache

Aracın başarılı olduğunu belirten bir ileti günlüğe kaydedilir:

Table and index were created successfully.

Araç tarafından sql-cache oluşturulan tablo aşağıdaki şemaya sahiptir:

SqlServer Önbellek Tablosu

Not

Bir uygulama önbellek değerlerini bir örneğini IDistributedCachekullanarak işlemelidir, değil SqlServerCache.

Örnek uygulama içinde Geliştirme olmayan bir ortamda Program.csuygulanırSqlServerCache:

builder.Services.AddDistributedSqlServerCache(options =>
{
    options.ConnectionString = builder.Configuration.GetConnectionString(
        "DistCache_ConnectionString");
    options.SchemaName = "dbo";
    options.TableName = "TestCache";
});

Not

(ConnectionStringve isteğe bağlı olarak SchemaName ve TableName) genellikle kaynak denetiminin dışında depolanır (örneğin, Gizli Dizi Yöneticisi tarafından veya dosyalarda appsettings.json/appsettings.{Environment}.json depolanır). bağlantı dizesi, kaynak denetim sistemlerinden uzak tutulması gereken kimlik bilgileri içerebilir.

Dağıtılmış NCache Önbelleği

NCache, .NET ve .NET Core'da yerel olarak geliştirilen açık kaynak bellek içi dağıtılmış önbellektir. NCache, Azure'da veya diğer barındırma platformlarında çalışan bir ASP.NET Core uygulaması için hem yerel olarak çalışır hem de dağıtılmış önbellek kümesi olarak yapılandırılır.

NCache'i yerel makinenize yüklemek ve yapılandırmak için bkz . Windows için Başlarken Kılavuzu (.NET ve .NET Core).

NCache'i yapılandırmak için:

  1. NCache açık kaynak NuGet'i yükleyin.
  2. client.ncconf dosyasında önbellek kümesini yapılandırın.
  3. Aşağıdaki kodu Program.cs dosyasına ekleyin:
builder.Services.AddNCacheDistributedCache(configuration =>
{
    configuration.CacheName = "democache";
    configuration.EnableLogs = true;
    configuration.ExceptionsEnabled = true;
});

Dağıtılmış Azure CosmosDB Önbelleği

Azure Cosmos DB , arabirimi kullanılarak IDistributedCache ASP.NET Core'da oturum durumu sağlayıcısı olarak kullanılabilir. Azure Cosmos DB, görev açısından kritik uygulamalar için yüksek kullanılabilirlik, ölçeklenebilirlik ve düşük gecikme süreli verilere erişim sunan, modern uygulama geliştirmeye yönelik tam olarak yönetilen bir NoSQL ve ilişkisel veritabanıdır.

Microsoft.Extensions.Caching.Cosmos NuGet paketini yükledikten sonra Azure Cosmos DB dağıtılmış önbelleğini aşağıdaki gibi yapılandırın:

Mevcut istemciyi yeniden kullanma

Dağıtılmış önbelleği yapılandırmanın en kolay yolu, mevcut bir Azure Cosmos DB istemcisini yeniden kullanmaktır. Bu durumda, CosmosClient sağlayıcı atıldığında örnek atılamaz.

services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
    cacheOptions.ContainerName = Configuration["CosmosCacheContainer"];
    cacheOptions.DatabaseName = Configuration["CosmosCacheDatabase"];
    cacheOptions.CosmosClient = existingCosmosClient;
    cacheOptions.CreateIfNotExists = true;
});

Yeni istemci oluşturma

Alternatif olarak, yeni bir istemci örneği oluşturun. Bu durumda, CosmosClient sağlayıcı atıldığında örnek atılır.

services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
    cacheOptions.ContainerName = Configuration["CosmosCacheContainer"];
    cacheOptions.DatabaseName = Configuration["CosmosCacheDatabase"];
    cacheOptions.ClientBuilder = new CosmosClientBuilder(Configuration["CosmosConnectionString"]);
    cacheOptions.CreateIfNotExists = true;
});

Dağıtılmış önbelleği kullanma

Arabirimini kullanmak IDistributedCache için uygulamadaki bir örneğini IDistributedCache isteyin. Örnek, bağımlılık ekleme (DI) tarafından sağlanır.

Örnek uygulama başlatıldığında içine IDistributedCache eklenir Program.cs. Geçerli saat kullanılarak IHostApplicationLifetime önbelleğe alınır (daha fazla bilgi için bkz . Genel Konak: IHostApplicationLifetime):

app.Lifetime.ApplicationStarted.Register(() =>
{
    var currentTimeUTC = DateTime.UtcNow.ToString();
    byte[] encodedCurrentTimeUTC = System.Text.Encoding.UTF8.GetBytes(currentTimeUTC);
    var options = new DistributedCacheEntryOptions()
        .SetSlidingExpiration(TimeSpan.FromSeconds(20));
    app.Services.GetService<IDistributedCache>()
                              .Set("cachedTimeUTC", encodedCurrentTimeUTC, options);
});

Örnek uygulama, Dizin sayfası tarafından kullanılmak üzere öğesine IndexModel eklerIDistributedCache.

Dizin sayfası her yüklendiğinde, önbellek içinde OnGetAsyncönbelleğe alınmış süre için denetlenır. Önbelleğe alınan süre dolmadıysa, süre görüntülenir. Önbelleğe alınan süreye en son erişildiğinden (bu sayfa en son yüklendiğinde) 20 saniye geçtiyse, sayfa Önbelleğe Alınmış Süre Doldu olarak görüntülenir.

Önbelleğe Alınan Zamanı Sıfırla düğmesini seçerek önbelleğe alınan zamanı hemen geçerli saate güncelleştirin. düğmesi işleyici yöntemini tetikler OnPostResetCachedTime .

public class IndexModel : PageModel
{
    private readonly IDistributedCache _cache;

    public IndexModel(IDistributedCache cache)
    {
        _cache = cache;
    }

    public string? CachedTimeUTC { get; set; }
    public string? ASP_Environment { get; set; }

    public async Task OnGetAsync()
    {
        CachedTimeUTC = "Cached Time Expired";
        var encodedCachedTimeUTC = await _cache.GetAsync("cachedTimeUTC");

        if (encodedCachedTimeUTC != null)
        {
            CachedTimeUTC = Encoding.UTF8.GetString(encodedCachedTimeUTC);
        }

        ASP_Environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        if (String.IsNullOrEmpty(ASP_Environment))
        {
            ASP_Environment = "Null, so Production";
        }
    }

    public async Task<IActionResult> OnPostResetCachedTime()
    {
        var currentTimeUTC = DateTime.UtcNow.ToString();
        byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
        var options = new DistributedCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromSeconds(20));
        await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);

        return RedirectToPage();
    }
}

Yerleşik uygulamalarla örnekler için IDistributedCache Tekil veya Kapsamlı yaşam süresi kullanmanıza gerek yoktur.

Di kullanmak yerine ihtiyacınız olabilecek her yerde bir IDistributedCache örnek de oluşturabilirsiniz, ancak kodda örnek oluşturmak kodunuzun Açık Bağımlılıklar İlkesi'ni test etmelerini ve ihlal etmelerini zorlaştırabilir.

Öneriler

Hangi uygulamasının IDistributedCache uygulamanız için en uygun olduğuna karar verirken aşağıdakileri göz önünde bulundurun:

  • Mevcut altyapı
  • Performans gereksinimleri
  • Maliyet
  • Ekip deneyimi

Önbelleğe alma çözümleri genellikle önbelleğe alınan verilerin hızlı alınmasını sağlamak için bellek içi depolamaya dayanır, ancak bellek sınırlı bir kaynaktır ve genişletilmesi maliyetlidir. Yalnızca yaygın olarak kullanılan verileri önbellekte depolayın.

Çoğu uygulama için Redis önbelleği, SQL Server önbelleğinden daha yüksek aktarım hızı ve daha düşük gecikme süresi sağlar. Ancak, önbelleğe alma stratejilerinin performans özelliklerini belirlemek için karşılaştırma önerilir.

SQL Server dağıtılmış önbellek yedekleme deposu olarak kullanıldığında, önbellek için aynı veritabanının kullanılması ve uygulamanın normal veri depolama ve alma işlemleri her ikisinin performansını olumsuz etkileyebilir. Dağıtılmış önbellek yedekleme deposu için ayrılmış bir SQL Server örneği kullanmanızı öneririz.

Ek kaynaklar

Dağıtılmış önbellek, birden çok uygulama sunucusu tarafından paylaşılan ve genellikle bu sunucuya erişen uygulama sunucularında dış hizmet olarak tutulan bir önbellektir. Dağıtılmış önbellek, özellikle uygulama bir bulut hizmeti veya sunucu grubu tarafından barındırıldığında ASP.NET Core uygulamasının performansını ve ölçeklenebilirliğini iyileştirebilir.

Dağıtılmış önbellek, önbelleğe alınan verilerin tek tek uygulama sunucularında depolandığı diğer önbelleğe alma senaryolarına göre çeşitli avantajlara sahiptir.

Önbelleğe alınan veriler dağıtıldığında, veriler:

  • Birden çok sunucuya yönelik istekler arasında tutarlı (tutarlı).
  • Sunucu yeniden başlatmalarını ve uygulama dağıtımlarını sürdürmektedir.
  • Yerel bellek kullanmaz.

Dağıtılmış önbellek yapılandırması uygulamaya özgüdür. Bu makalede SQL Server ve Redis dağıtılmış önbelleklerinin nasıl yapılandırıldığı açıklanmaktadır. NCache (GitHub'da NCache) gibi üçüncü taraf uygulamaları da kullanılabilir. Hangi uygulamanın seçildiğinden bağımsız olarak, uygulama arabirimini kullanarak önbellekle etkileşim kurar IDistributedCache .

Örnek kodu görüntüleme veya indirme (indirme)

Önkoşullar

Kullanılan dağıtılmış önbellek sağlayıcısı için paket başvurusu ekleyin:

IDistributedCache arabirimi

Arabirim, IDistributedCache dağıtılmış önbellek uygulamasındaki öğeleri işlemek için aşağıdaki yöntemleri sağlar:

  • Get, GetAsync: Bir dize anahtarını kabul eder ve önbellekte bulunursa önbelleğe alınmış bir byte[] öğeyi dizi olarak alır.
  • Set, SetAsync: Dize anahtarı kullanarak önbelleğe bir öğe (dizi olarak byte[] ) ekler.
  • Refresh, RefreshAsync: Önbellekteki bir öğeyi anahtarına göre yeniler ve kayan süre sonu zaman aşımını (varsa) sıfırlar.
  • Remove, RemoveAsync: Bir önbellek öğesini dize anahtarına göre kaldırır.

Dağıtılmış önbelleğe alma hizmetleri oluşturma

uygulamasını IDistributedCache içinde Program.cskaydedin. Bu konuda açıklanan çerçeve tarafından sağlanan uygulamalar şunlardır:

Dağıtılmış Redis Önbelleği

Üretim uygulamalarının Dağıtılmış Redis Önbelleği'ni kullanmasını öneririz, çünkü en yüksek performansa olanak sağlar. Daha fazla bilgi için bkz . Öneriler.

Redis, genellikle dağıtılmış önbellek olarak kullanılan açık kaynak bellek içi veri deposudur. Azure'da barındırılan bir ASP.NET Core uygulaması için Azure Redis Cache yapılandırabilir ve yerel geliştirme için Azure Redis Cache kullanabilirsiniz.

Uygulama, önbellek uygulamasını bir RedisCache örnek (AddStackExchangeRedisCache kullanarak yapılandırır.

  1. bir Redis için Azure Cache oluşturun.
  2. Birincil bağlantı dizesi (StackExchange.Redis) Yapılandırma'ya kopyalayın.

Aşağıdaki kod Redis için Azure Cache etkinleştirir:

builder.Services.AddStackExchangeRedisCache(options =>
 {
     options.Configuration = builder.Configuration.GetConnectionString("MyRedisConStr");
     options.InstanceName = "SampleInstance";
 });

Yukarıdaki kodda Birincil bağlantı dizesi (StackExchange.Redis) anahtar adıyla MyRedisConStryapılandırmaya kaydedildiği varsayılır.

Daha fazla bilgi için bkz. Redis için Azure Cache.

Yerel Redis önbelleğine yönelik alternatif yaklaşımlar hakkında bir tartışma için bu GitHub sorununa bakın.

Dağıtılmış Bellek Önbelleği

Dağıtılmış Bellek Önbelleği (AddDistributedMemoryCache), öğeleri bellekte depolayan çerçeve tarafından sağlanan bir uygulamadır IDistributedCache . Dağıtılmış Bellek Önbelleği gerçek bir dağıtılmış önbellek değildir. Önbelleğe alınan öğeler, uygulamanın çalıştığı sunucudaki uygulama örneği tarafından depolanır.

Dağıtılmış Bellek Önbelleği yararlı bir uygulamadır:

  • Geliştirme ve test senaryolarında.
  • Üretimde tek bir sunucu kullanıldığında ve bellek tüketimi sorun olmadığında. Dağıtılmış Bellek Önbelleğinin uygulanması önbelleğe alınan veri depolamayı soyutlar. Gelecekte birden çok düğüm veya hataya dayanıklılık gerekli hale gelirse gerçek bir dağıtılmış önbelleğe alma çözümü uygulamaya olanak tanır.

Örnek uygulama, içindeki Geliştirme ortamında çalıştırıldığında Dağıtılmış Bellek Önbelleği'ni Program.cskullanır:

builder.Services.AddDistributedMemoryCache();

Dağıtılmış SQL Server Önbelleği

Dağıtılmış SQL Server Önbelleği uygulaması (AddDistributedSqlServerCache), dağıtılmış önbelleğin bir SQL Server veritabanını yedekleme deposu olarak kullanmasına izin verir. BIR SQL Server örneğinde SQL Server önbelleğe alınmış bir öğe tablosu oluşturmak için aracı kullanabilirsiniz sql-cache . Araç, belirttiğiniz ada ve şemaya sahip bir tablo oluşturur.

komutunu çalıştırarak sql-cache create SQL Server'da bir tablo oluşturun. SQL Server örneğini (), veritabanını (Data SourceInitial Catalog), şemasını (örneğin, dbo) ve tablo adını (örneğin, TestCache):

dotnet sql-cache create "Data Source=(localdb)/MSSQLLocalDB;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache

Aracın başarılı olduğunu belirten bir ileti günlüğe kaydedilir:

Table and index were created successfully.

Araç tarafından sql-cache oluşturulan tablo aşağıdaki şemaya sahiptir:

SqlServer Önbellek Tablosu

Not

Bir uygulama önbellek değerlerini bir örneğini IDistributedCachekullanarak işlemelidir, değil SqlServerCache.

Örnek uygulama içinde Geliştirme olmayan bir ortamda Program.csuygulanırSqlServerCache:

builder.Services.AddDistributedSqlServerCache(options =>
{
    options.ConnectionString = builder.Configuration.GetConnectionString(
        "DistCache_ConnectionString");
    options.SchemaName = "dbo";
    options.TableName = "TestCache";
});

Not

(ConnectionStringve isteğe bağlı olarak SchemaName ve TableName) genellikle kaynak denetiminin dışında depolanır (örneğin, Gizli Dizi Yöneticisi tarafından veya dosyalarda appsettings.json/appsettings.{Environment}.json depolanır). bağlantı dizesi, kaynak denetim sistemlerinden uzak tutulması gereken kimlik bilgileri içerebilir.

Dağıtılmış NCache Önbelleği

NCache, .NET ve .NET Core'da yerel olarak geliştirilen açık kaynak bellek içi dağıtılmış önbellektir. NCache, Azure'da veya diğer barındırma platformlarında çalışan bir ASP.NET Core uygulaması için hem yerel olarak çalışır hem de dağıtılmış önbellek kümesi olarak yapılandırılır.

NCache'i yerel makinenize yüklemek ve yapılandırmak için bkz . Windows için Başlarken Kılavuzu (.NET ve .NET Core).

NCache'i yapılandırmak için:

  1. NCache açık kaynak NuGet'i yükleyin.
  2. client.ncconf dosyasında önbellek kümesini yapılandırın.
  3. Aşağıdaki kodu Program.cs dosyasına ekleyin:
builder.Services.AddNCacheDistributedCache(configuration =>
{
    configuration.CacheName = "democache";
    configuration.EnableLogs = true;
    configuration.ExceptionsEnabled = true;
});

Dağıtılmış önbelleği kullanma

Arabirimini kullanmak IDistributedCache için uygulamadaki bir örneğini IDistributedCache isteyin. Örnek, bağımlılık ekleme (DI) tarafından sağlanır.

Örnek uygulama başlatıldığında içine IDistributedCache eklenir Program.cs. Geçerli saat kullanılarak IHostApplicationLifetime önbelleğe alınır (daha fazla bilgi için bkz . Genel Konak: IHostApplicationLifetime):

app.Lifetime.ApplicationStarted.Register(() =>
{
    var currentTimeUTC = DateTime.UtcNow.ToString();
    byte[] encodedCurrentTimeUTC = System.Text.Encoding.UTF8.GetBytes(currentTimeUTC);
    var options = new DistributedCacheEntryOptions()
        .SetSlidingExpiration(TimeSpan.FromSeconds(20));
    app.Services.GetService<IDistributedCache>()
                              .Set("cachedTimeUTC", encodedCurrentTimeUTC, options);
});

Örnek uygulama, Dizin sayfası tarafından kullanılmak üzere öğesine IndexModel eklerIDistributedCache.

Dizin sayfası her yüklendiğinde, önbellek içinde OnGetAsyncönbelleğe alınmış süre için denetlenır. Önbelleğe alınan süre dolmadıysa, süre görüntülenir. Önbelleğe alınan süreye en son erişildiğinden (bu sayfa en son yüklendiğinde) 20 saniye geçtiyse, sayfa Önbelleğe Alınmış Süre Doldu olarak görüntülenir.

Önbelleğe Alınan Zamanı Sıfırla düğmesini seçerek önbelleğe alınan zamanı hemen geçerli saate güncelleştirin. düğmesi işleyici yöntemini tetikler OnPostResetCachedTime .

public class IndexModel : PageModel
{
    private readonly IDistributedCache _cache;

    public IndexModel(IDistributedCache cache)
    {
        _cache = cache;
    }

    public string? CachedTimeUTC { get; set; }
    public string? ASP_Environment { get; set; }

    public async Task OnGetAsync()
    {
        CachedTimeUTC = "Cached Time Expired";
        var encodedCachedTimeUTC = await _cache.GetAsync("cachedTimeUTC");

        if (encodedCachedTimeUTC != null)
        {
            CachedTimeUTC = Encoding.UTF8.GetString(encodedCachedTimeUTC);
        }

        ASP_Environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        if (String.IsNullOrEmpty(ASP_Environment))
        {
            ASP_Environment = "Null, so Production";
        }
    }

    public async Task<IActionResult> OnPostResetCachedTime()
    {
        var currentTimeUTC = DateTime.UtcNow.ToString();
        byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
        var options = new DistributedCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromSeconds(20));
        await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);

        return RedirectToPage();
    }
}

Yerleşik uygulamalarla örnekler için IDistributedCache Tekil veya Kapsamlı yaşam süresi kullanmanıza gerek yoktur.

Di kullanmak yerine ihtiyacınız olabilecek her yerde bir IDistributedCache örnek de oluşturabilirsiniz, ancak kodda örnek oluşturmak kodunuzun Açık Bağımlılıklar İlkesi'ni test etmelerini ve ihlal etmelerini zorlaştırabilir.

Öneriler

Hangi uygulamasının IDistributedCache uygulamanız için en uygun olduğuna karar verirken aşağıdakileri göz önünde bulundurun:

  • Mevcut altyapı
  • Performans gereksinimleri
  • Maliyet
  • Ekip deneyimi

Önbelleğe alma çözümleri genellikle önbelleğe alınan verilerin hızlı alınmasını sağlamak için bellek içi depolamaya dayanır, ancak bellek sınırlı bir kaynaktır ve genişletilmesi maliyetlidir. Yalnızca yaygın olarak kullanılan verileri önbellekte depolayın.

Çoğu uygulama için Redis önbelleği, SQL Server önbelleğinden daha yüksek aktarım hızı ve daha düşük gecikme süresi sağlar. Ancak, önbelleğe alma stratejilerinin performans özelliklerini belirlemek için karşılaştırma önerilir.

SQL Server dağıtılmış önbellek yedekleme deposu olarak kullanıldığında, önbellek için aynı veritabanının kullanılması ve uygulamanın normal veri depolama ve alma işlemleri her ikisinin performansını olumsuz etkileyebilir. Dağıtılmış önbellek yedekleme deposu için ayrılmış bir SQL Server örneği kullanmanızı öneririz.

Ek kaynaklar

Dağıtılmış önbellek, birden çok uygulama sunucusu tarafından paylaşılan ve genellikle bu sunucuya erişen uygulama sunucularında dış hizmet olarak tutulan bir önbellektir. Dağıtılmış önbellek, özellikle uygulama bir bulut hizmeti veya sunucu grubu tarafından barındırıldığında ASP.NET Core uygulamasının performansını ve ölçeklenebilirliğini iyileştirebilir.

Dağıtılmış önbellek, önbelleğe alınan verilerin tek tek uygulama sunucularında depolandığı diğer önbelleğe alma senaryolarına göre çeşitli avantajlara sahiptir.

Önbelleğe alınan veriler dağıtıldığında, veriler:

  • Birden çok sunucuya yönelik istekler arasında tutarlı (tutarlı).
  • Sunucu yeniden başlatmalarını ve uygulama dağıtımlarını sürdürmektedir.
  • Yerel bellek kullanmaz.

Dağıtılmış önbellek yapılandırması uygulamaya özgüdür. Bu makalede SQL Server ve Redis dağıtılmış önbelleklerinin nasıl yapılandırıldığı açıklanmaktadır. NCache (GitHub'da NCache) gibi üçüncü taraf uygulamaları da kullanılabilir. Hangi uygulamanın seçildiğinden bağımsız olarak, uygulama arabirimini kullanarak önbellekle etkileşim kurar IDistributedCache .

Örnek kodu görüntüleme veya indirme (indirme)

Önkoşullar

SQL Server dağıtılmış önbelleğini kullanmak için Microsoft.Extensions.Caching.SqlServer paketine bir paket başvurusu ekleyin.

Redis dağıtılmış önbelleğini kullanmak için Microsoft.Extensions.Caching.StackExchangeRedis paketine bir paket başvurusu ekleyin.

NCache dağıtılmış önbelleğini kullanmak için NCache.Microsoft.Extensions.Caching.OpenSource paketine bir paket başvurusu ekleyin.

IDistributedCache arabirimi

Arabirim, IDistributedCache dağıtılmış önbellek uygulamasındaki öğeleri işlemek için aşağıdaki yöntemleri sağlar:

  • Get, GetAsync: Bir dize anahtarını kabul eder ve önbellekte bulunursa önbelleğe alınmış bir byte[] öğeyi dizi olarak alır.
  • Set, SetAsync: Dize anahtarı kullanarak önbelleğe bir öğe (dizi olarak byte[] ) ekler.
  • Refresh, RefreshAsync: Önbellekteki bir öğeyi anahtarına göre yeniler ve kayan süre sonu zaman aşımını (varsa) sıfırlar.
  • Remove, RemoveAsync: Bir önbellek öğesini dize anahtarına göre kaldırır.

Dağıtılmış önbelleğe alma hizmetleri oluşturma

uygulamasını IDistributedCache içinde Startup.ConfigureServiceskaydedin. Bu konuda açıklanan çerçeve tarafından sağlanan uygulamalar şunlardır:

Dağıtılmış Bellek Önbelleği

Dağıtılmış Bellek Önbelleği (AddDistributedMemoryCache), öğeleri bellekte depolayan çerçeve tarafından sağlanan bir uygulamadır IDistributedCache . Dağıtılmış Bellek Önbelleği gerçek bir dağıtılmış önbellek değildir. Önbelleğe alınan öğeler, uygulamanın çalıştığı sunucudaki uygulama örneği tarafından depolanır.

Dağıtılmış Bellek Önbelleği yararlı bir uygulamadır:

  • Geliştirme ve test senaryolarında.
  • Üretimde tek bir sunucu kullanıldığında ve bellek tüketimi sorun olmadığında. Dağıtılmış Bellek Önbelleğinin uygulanması önbelleğe alınan veri depolamayı soyutlar. Gelecekte birden çok düğüm veya hataya dayanıklılık gerekli hale gelirse gerçek bir dağıtılmış önbelleğe alma çözümü uygulamaya olanak tanır.

Örnek uygulama, içindeki Geliştirme ortamında çalıştırıldığında Dağıtılmış Bellek Önbelleği'ni Startup.ConfigureServiceskullanır:

services.AddDistributedMemoryCache();

Dağıtılmış SQL Server Önbelleği

Dağıtılmış SQL Server Önbelleği uygulaması (AddDistributedSqlServerCache), dağıtılmış önbelleğin bir SQL Server veritabanını yedekleme deposu olarak kullanmasına izin verir. BIR SQL Server örneğinde SQL Server önbelleğe alınmış bir öğe tablosu oluşturmak için aracı kullanabilirsiniz sql-cache . Araç, belirttiğiniz ada ve şemaya sahip bir tablo oluşturur.

komutunu çalıştırarak sql-cache create SQL Server'da bir tablo oluşturun. SQL Server örneğini (), veritabanını (Data SourceInitial Catalog), şemasını (örneğin, dbo) ve tablo adını (örneğin, TestCache):

dotnet sql-cache create "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache

Aracın başarılı olduğunu belirten bir ileti günlüğe kaydedilir:

Table and index were created successfully.

Araç tarafından sql-cache oluşturulan tablo aşağıdaki şemaya sahiptir:

SqlServer Önbellek Tablosu

Not

Bir uygulama önbellek değerlerini bir örneğini IDistributedCachekullanarak işlemelidir, değil SqlServerCache.

Örnek uygulama içinde Geliştirme olmayan bir ortamda Startup.ConfigureServicesuygulanırSqlServerCache:

services.AddDistributedSqlServerCache(options =>
{
    options.ConnectionString = 
        _config["DistCache_ConnectionString"];
    options.SchemaName = "dbo";
    options.TableName = "TestCache";
});

Not

(ConnectionStringve isteğe bağlı olarak SchemaName ve TableName) genellikle kaynak denetiminin dışında depolanır (örneğin, Gizli Dizi Yöneticisi tarafından veya dosyalarda appsettings.json/appsettings.{Environment}.json depolanır). bağlantı dizesi, kaynak denetim sistemlerinden uzak tutulması gereken kimlik bilgileri içerebilir.

Dağıtılmış Redis Önbelleği

Redis, genellikle dağıtılmış önbellek olarak kullanılan açık kaynak bellek içi veri deposudur. Azure'da barındırılan bir ASP.NET Core uygulaması için Azure Redis Cache yapılandırabilir ve yerel geliştirme için Azure Redis Cache kullanabilirsiniz.

Uygulama, önbellek uygulamasını bir RedisCache örnek (AddStackExchangeRedisCache kullanarak yapılandırır.

  1. bir Redis için Azure Cache oluşturun.
  2. Birincil bağlantı dizesi (StackExchange.Redis) Yapılandırma'ya kopyalayın.

Aşağıdaki kod Redis için Azure Cache etkinleştirir:

public void ConfigureServices(IServiceCollection services)
{
    if (_hostContext.IsDevelopment())
    {
        services.AddDistributedMemoryCache();
    }
    else
    {
        services.AddStackExchangeRedisCache(options =>
        {
            options.Configuration = _config["MyRedisConStr"];
            options.InstanceName = "SampleInstance";
        });
    }

    services.AddRazorPages();
}

Yukarıdaki kodda Birincil bağlantı dizesi (StackExchange.Redis) anahtar adıyla MyRedisConStryapılandırmaya kaydedildiği varsayılır.

Daha fazla bilgi için bkz. Redis için Azure Cache.

Yerel Redis önbelleğine yönelik alternatif yaklaşımlar hakkında bir tartışma için bu GitHub sorununa bakın.

Dağıtılmış NCache Önbelleği

NCache, .NET ve .NET Core'da yerel olarak geliştirilen açık kaynak bellek içi dağıtılmış önbellektir. NCache, Azure'da veya diğer barındırma platformlarında çalışan bir ASP.NET Core uygulaması için hem yerel olarak çalışır hem de dağıtılmış önbellek kümesi olarak yapılandırılır.

NCache'i yerel makinenize yüklemek ve yapılandırmak için bkz . Windows için Başlarken Kılavuzu (.NET ve .NET Core).

NCache'i yapılandırmak için:

  1. NCache açık kaynak NuGet'i yükleyin.

  2. client.ncconf dosyasında önbellek kümesini yapılandırın.

  3. Aşağıdaki kodu Startup.ConfigureServices dosyasına ekleyin:

    services.AddNCacheDistributedCache(configuration =>    
    {        
        configuration.CacheName = "demoClusteredCache";
        configuration.EnableLogs = true;
        configuration.ExceptionsEnabled = true;
    });
    

Dağıtılmış önbelleği kullanma

Arabirimini kullanmak için uygulamadaki IDistributedCache herhangi bir oluşturucudan örneğini IDistributedCache isteyin. Örnek, bağımlılık ekleme (DI) tarafından sağlanır.

Örnek uygulama başlatıldığında içine IDistributedCache eklenir Startup.Configure. Geçerli saat kullanılarak IHostApplicationLifetime önbelleğe alınır (daha fazla bilgi için bkz . Genel Konak: IHostApplicationLifetime):

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, 
    IHostApplicationLifetime lifetime, IDistributedCache cache)
{
    lifetime.ApplicationStarted.Register(() =>
    {
        var currentTimeUTC = DateTime.UtcNow.ToString();
        byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
        var options = new DistributedCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromSeconds(20));
        cache.Set("cachedTimeUTC", encodedCurrentTimeUTC, options);
    });

Örnek uygulama, Dizin sayfası tarafından kullanılmak üzere öğesine IndexModel eklerIDistributedCache.

Dizin sayfası her yüklendiğinde, önbellek içinde OnGetAsyncönbelleğe alınmış süre için denetlenır. Önbelleğe alınan süre dolmadıysa, süre görüntülenir. Önbelleğe alınan süreye en son erişildiğinden (bu sayfa en son yüklendiğinde) 20 saniye geçtiyse, sayfa Önbelleğe Alınmış Süre Doldu olarak görüntülenir.

Önbelleğe Alınan Zamanı Sıfırla düğmesini seçerek önbelleğe alınan zamanı hemen geçerli saate güncelleştirin. düğmesi işleyici yöntemini tetikler OnPostResetCachedTime .

public class IndexModel : PageModel
{
    private readonly IDistributedCache _cache;

    public IndexModel(IDistributedCache cache)
    {
        _cache = cache;
    }

    public string CachedTimeUTC { get; set; }

    public async Task OnGetAsync()
    {
        CachedTimeUTC = "Cached Time Expired";
        var encodedCachedTimeUTC = await _cache.GetAsync("cachedTimeUTC");

        if (encodedCachedTimeUTC != null)
        {
            CachedTimeUTC = Encoding.UTF8.GetString(encodedCachedTimeUTC);
        }
    }

    public async Task<IActionResult> OnPostResetCachedTime()
    {
        var currentTimeUTC = DateTime.UtcNow.ToString();
        byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
        var options = new DistributedCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromSeconds(20));
        await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);

        return RedirectToPage();
    }
}

Not

Örnekler için (en azından yerleşik uygulamalar için IDistributedCache ) Tekil veya Kapsamlı yaşam süresi kullanmanız gerekmez.

Di kullanmak yerine ihtiyacınız olabilecek her yerde bir IDistributedCache örnek de oluşturabilirsiniz, ancak kodda örnek oluşturmak kodunuzun Açık Bağımlılıklar İlkesi'ni test etmelerini ve ihlal etmelerini zorlaştırabilir.

Öneriler

Hangi uygulamasının IDistributedCache uygulamanız için en uygun olduğuna karar verirken aşağıdakileri göz önünde bulundurun:

  • Mevcut altyapı
  • Performans gereksinimleri
  • Maliyet
  • Ekip deneyimi

Önbelleğe alma çözümleri genellikle önbelleğe alınan verilerin hızlı alınmasını sağlamak için bellek içi depolamaya dayanır, ancak bellek sınırlı bir kaynaktır ve genişletilmesi maliyetlidir. Yalnızca yaygın olarak kullanılan verileri önbellekte depolayın.

Redis önbelleği genellikle SQL Server önbelleğine göre daha yüksek aktarım hızı ve daha düşük gecikme süresi sağlar. Ancak, önbelleğe alma stratejilerinin performans özelliklerini belirlemek için genellikle karşılaştırma gerekir.

SQL Server dağıtılmış önbellek yedekleme deposu olarak kullanıldığında, önbellek için aynı veritabanının kullanılması ve uygulamanın normal veri depolama ve alma işlemleri her ikisinin performansını olumsuz etkileyebilir. Dağıtılmış önbellek yedekleme deposu için ayrılmış bir SQL Server örneği kullanmanızı öneririz.

Ek kaynaklar