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

Tarafından Mohsin Nasir and smandia

Note

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.

Warning

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 10 sürümüne bakın.

Dağıtılmış önbellek, birden çok uygulama sunucusu tarafından paylaşılan bir önbellektir. Önbellek genellikle ona erişen uygulama sunucuları için bir dış hizmet olarak tutulur. Dağıtılmış önbellek, özellikle bir bulut hizmeti veya sunucu grubu uygulamayı barındırdığı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 yapılan isteklerde tutarlılık (tutarlılık) mevcuttur.
  • Sunucu yeniden başlatmalarına ve uygulama dağıtımlarına rağmen varlığını sürdürür.
  • Yerel bellek kullanmaz.

Dağıtılmış önbellek yapılandırması uygulamaya özgüdür. Bu makalede SQL Server, Redis veya Postgres dağıtılmış önbelleklerinin nasıl yapılandırıldığı açıklanır. NCache (NCache on GitHub), Azure Cosmos DB ve Postgres gibi Microsoft olmayan 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)

Warning

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ı.

Prerequisites

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

IDistributedCache arabirimini kullanma

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ı IDistributedCacheProgram.cs dosyasına kaydedin. Aşağıdaki çerçeve tarafından sağlanan uygulamalar bu makalede açıklanmıştır:

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

Dağıtılmış Redis önbelleği en iyi performansı sunar ve üretim uygulamaları için önerilir. 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. Daha fazla bilgi için bkz. Önbellek önerilerini gözden geçirme.

Uygulama, AddStackExchangeRedisCache yöntemini çağırarak önbellek uygulamasını bir RedisCache örneğiyle yapılandırır. Çıktı önbelleğe alma için AddStackExchangeRedisOutputCache yöntemini kullanın.

  1. bir Redis için Azure Cache örneği oluşturun.

  2. Birincil bağlantı dizesini (StackExchange.Redis) Configuration kopyalayın.

    • Yerel geliştirme için: bağlantı dizesi Secret Manager ile kaydedin.

    • Azure için: Bağlantı dizesini Azure Key Vault gibi güvenli bir depoda kaydedin.

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 kod, birincil bağlantı dizesinin (StackExchange.Redis) MyRedisConStr anahtar adıyla yapılandırmaya kaydedildiği varsayılır.

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

Yerel Redis önbelleğine alternatif yaklaşımlar hakkında daha fazla bilgi için bkz. GitHub /dotnet/aspnetcore sorunu #19542.

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

Dağıtılmış bellek önbelleği (AddDistributedMemoryCache), çerçevenin sağladığı ve öğeleri bellekte depolayan bir IDistributedCache uygulamasıdır. Ancak, dağıtılmış bellek önbelleği gerçek bir dağıtılmış önbellek değildir. Uygulama örneği, önbelleğe alınan öğeleri uygulamanın çalıştığı sunucuda depolar.

Dağıtılmış bellek önbelleği, geliştirme ve test senaryoları için kullanışlı bir uygulamadır. Ayrıca, bellek tüketiminin sorun oluşturmadığı bir üretim senaryosunda tek bir sunucu için de kullanışlıdır. 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, uygulama Development dosyasındaki ortamda çalıştırıldığında dağıtılmış bellek önbelleğini kullanı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 olanak tanır. 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

Araç başarılı olduğunda 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:

'sql-cache create' komutuyla oluşturulan SQL Server önbellek tablosunun şemasını gösteren Screenshot

Note

Uygulamanın önbellek değerlerini SqlServerCache yerine IDistributedCache örneğini kullanarak işlemesi gerekir.

Örnek uygulama sınıfını SqlServerCacheDevelopment dosyasındaki bir geliştirmesiz () ortamda uygular:

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

Note

(ve isteğe bağlı olarak ConnectionString ve SchemaName) gibi TableName özellikler genellikle kaynak denetimi dışında depolanır. Örneğin, Gizli Dizi Yöneticisi veya appsettings.json ya da uygulama ayarları.{ Environment}.json dosyası özellikleri depolayabilir. bağlantı dizesi, kaynak denetim sistemlerinden uzak tutulması gereken kimlik bilgilerini içerebilir.

Daha fazla bilgi için bkz. Azure üzerinde SQL Veritabanı.

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

PostgreSQL için Azure Veritabanı , arabirim aracılığıyla IDistributedCache dağıtılmış önbellek yedekleme deposu olarak kullanılabilir. PostgreSQL için Azure Veri Tabanı, açık kaynak PostgreSQL altyapısı üzerinde oluşturulmuş, tam olarak yönetilen, AI'ye hazır Bir Hizmet Olarak Veritabanı (DBaaS) teklifidir. Tasarım, öngörülebilir performans, sağlam güvenlik, yüksek kullanılabilirlik ve sorunsuz ölçeklenebilirlik özelliklerine sahip görev açısından kritik iş yüklerini destekler.

Microsoft.Extensions.Caching.Postgres NuGet paketini yükledikten sonra, dağıtılmış önbelleğinizi aşağıdaki gibi yapılandırın:

  1. Hizmeti kaydedin.

    using Microsoft.Extensions.DependencyInjection;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Register the Postgres distributed cache.
    builder.Services.AddDistributedPostgresCache(options => {
       options.ConnectionString = builder.Configuration.GetConnectionString("PostgresCache");
       options.SchemaName = builder.Configuration.GetValue<string>("PostgresCache:SchemaName", "public");
       options.TableName = builder.Configuration.GetValue<string>("PostgresCache:TableName", "cache");
       options.CreateIfNotExists = builder.Configuration.GetValue<bool>("PostgresCache:CreateIfNotExists", true);
       options.UseWAL = builder.Configuration.GetValue<bool>("PostgresCache:UseWAL", false);
    
       // Optional: Configure expiration settings.
    
       var expirationInterval = builder.Configuration.GetValue<string>("PostgresCache:ExpiredItemsDeletionInterval");
       if (!string.IsNullOrEmpty(expirationInterval) && TimeSpan.TryParse(expirationInterval, out var interval)) {
           options.ExpiredItemsDeletionInterval = interval;
       }
    
       var slidingExpiration = builder.Configuration.GetValue<string>("PostgresCache:DefaultSlidingExpiration");
       if (!string.IsNullOrEmpty(slidingExpiration) && TimeSpan.TryParse(slidingExpiration, out var sliding)) {
           options.DefaultSlidingExpiration = sliding;
       }
    });
    
    var app = builder.Build();
    
  2. Önbelleği kullanın.

    public class MyService {
        private readonly IDistributedCache _cache; 
    
        public MyService(IDistributedCache cache) {
            _cache = cache;
        }
    
        public async Task<string> GetDataAsync(string key) {
            var cachedData = await _cache.GetStringAsync(key);
    
            if (cachedData == null) {
    
                // Fetch the data from source.
                var data = await FetchDataFromSource();
    
                // Cache the data with options.
                var options = new DistributedCacheEntryOptions {
                   AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30),
                   SlidingExpiration = TimeSpan.FromMinutes(5)
                };
    
                await _cache.SetStringAsync(key, data, options);
                return data;
            }
    
            return cachedData;
        }
    }
    

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

NCache , .NET'te yerel olarak geliştirilen açık kaynaklı bir 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.

Yerel makinenize NCache yüklemek ve yapılandırmak için Bkz. Başlarken Kılavuzu.

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

  1. .NET Framework ve .NET Core uygulamaları için NCache Opensource'u destekleyen NCache SDK NuGet paketini yükleyin.

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

  3. Program.cs dosyasına aşağıdaki kodu ekleyin:

builder.Services.AddNCacheDistributedCache(configuration =>
{
    configuration.CacheName = "democache";
    configuration.EnableLogs = true;
    configuration.ExceptionsEnabled = true;
});

Dağıtılmış Azure Cosmos DB önbelleği

Azure Cosmos DBIDistributedCache arabirimi kullanılarak ASP.NET Core oturum durumu sağlayıcısı olarak yapılandırı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ği yapılandırın. Mevcut bir Azure Cosmos DB istemcisini kullanabilir veya aşağıdaki bölümlerde açıklandığı gibi yeni bir istemci oluşturabilirsiniz.

Daha fazla bilgi için NuGet paketi GitHub deposunun README dosyasına ve Azure Cosmos DB kullanarak Microsoft Önbelleğe Alma Uzantısına başvurun.

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ı elden çıkarıldığında örnek elden çıkarı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

IDistributedCache arabirimini kullanmak için, uygulamada IDistributedCache instance'ını isteyin. Örnek, bağımlılık enjeksiyonu (DI) tarafından sağlanır.

Örnek uygulama başlatıldığında, IDistributedCache örnek Program.cs dosyasına eklenir. Geçerli saat, IHostApplicationLifetime arabirimi kullanılarak önbelleğe alınır. (Daha fazla bilgi için bkz. .NET Generic Host: 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, IDistributedCache örneğini Dizin sayfası tarafından kullanılmak üzere IndexModel nesnesine enjekte eder.

Dizin sayfası her yüklendiğinde, önbellek, önbelleğe alınma süresi için OnGetAsync yöntemi kullanılarak denetlenir. Ö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 iletisini görüntüler.

Önbelleğe Alınan Zamanı Sıfırla seçeneğini belirleyerek önbelleğe alınan zamanı hemen geçerli saate güncelleştirin. Bu eylem 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();
    }
}

Note

Yerleşik uygulamaya sahip IDistributedCache örnekler için Singleton veya Scoped yaşam süresi kullanmanız gerekmez.

Di kullanmak yerine ihtiyaç duyabileceğiniz her yerde bir IDistributedCache örnek de oluşturabilirsiniz. Ancak kodda örnek oluşturmak kodunuzun testini zorlaştırabilir ve Açık Bağımlılıklar İlkesi'ni ihlal eder.

Önbellek önerilerini gözden geçirme

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

  • Mevcut altyapı
  • Performans gereksinimleri
  • Cost
  • 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 deposuysa ve önbellek ve uygulama veri depolama/alma aynı veritabanını kullanıyorsa performans azaltılabilir. Önerilen yaklaşım, dağıtılmış önbellek yedekleme deposu için ayrılmış bir SQL Server örneği kullanmaktır.

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, bu veriler:

  • Birden çok sunucuya yönelik istekler arasında tutarlıdır.
  • Sunucu yeniden başlatmalarına ve uygulama dağıtımlarına dayanır.
  • Yerel bellek kullanmaz.

Dağıtılmış önbellek yapılandırması uygulamaya özgüdür. Bu makalede SQL Server, Redis ve Postgres dağıtılmış önbelleklerinin nasıl yapılandırıldığı açıklanır. NCache (GitHub'da NCache) gibi üçüncü taraf uygulamaları da kullanılabilir. Uygulamanın hangi şekilde gerçekleştirildiğinden bağımsız olarak, uygulama IDistributedCache ara birimini kullanarak önbellekle etkileşim kurar.

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

Prerequisites

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

IDistributedCache arabirim

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

IDistributedCache uygulamasını Program.cs içinde kaydedin. Çerçevenin sağladığı uygulamalar bu konuda şöyle açıklanmıştı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. Redis için bir Azure Önbelleği 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, DevelopmentProgram.cs ortamında çalıştırıldığında Dağıtılmış Bellek Önbelleği'ni kullanı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

Note

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

Örnek uygulama, SqlServerCache-olmayan bir ortamda Development uygular Program.cs:

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

Note

(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ış Postgres Önbelleği

PostgreSQL için Azure Veritabanı , arabirim aracılığıyla IDistributedCache dağıtılmış önbellek yedekleme deposu olarak kullanılabilir. PostgreSQL için Azure Veritabanı, öngörülebilir performans, güçlü güvenlik, yüksek kullanılabilirlik ve sorunsuz ölçeklenebilirlik özelliklerine sahip görev açısından kritik iş yüklerini desteklemek üzere tasarlanmış, açık kaynak PostgreSQL altyapısı üzerinde oluşturulmuş, tam olarak yönetilen, AI'ye hazır bir Hizmet Olarak Veritabanı (DBaaS) teklifidir.

Microsoft.Extensions.Caching.Postgres NuGet paketini yükledikten sonra, dağıtılmış önbelleğinizi aşağıdaki gibi yapılandırın:

  1. Hizmeti Kaydetme
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

// Register Postgres distributed cache
builder.Services.AddDistributedPostgresCache(options => {
    options.ConnectionString = builder.Configuration.GetConnectionString("PostgresCache");
    options.SchemaName = builder.Configuration.GetValue<string>("PostgresCache:SchemaName", "public");
    options.TableName = builder.Configuration.GetValue<string>("PostgresCache:TableName", "cache");
    options.CreateIfNotExists = builder.Configuration.GetValue<bool>("PostgresCache:CreateIfNotExists", true);
    options.UseWAL = builder.Configuration.GetValue<bool>("PostgresCache:UseWAL", false);

    // Optional: Configure expiration settings

    var expirationInterval = builder.Configuration.GetValue<string>("PostgresCache:ExpiredItemsDeletionInterval");
    if (!string.IsNullOrEmpty(expirationInterval) && TimeSpan.TryParse(expirationInterval, out var interval)) {
        options.ExpiredItemsDeletionInterval = interval;
    }

    var slidingExpiration = builder.Configuration.GetValue<string>("PostgresCache:DefaultSlidingExpiration");
    if (!string.IsNullOrEmpty(slidingExpiration) && TimeSpan.TryParse(slidingExpiration, out var sliding)) {
        options.DefaultSlidingExpiration = sliding;
    }
});

var app = builder.Build();
  1. Önbelleği Kullanma
public class MyService {
    private readonly IDistributedCache _cache; 

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

    public async Task<string> GetDataAsync(string key) {
        var cachedData = await _cache.GetStringAsync(key);

        if (cachedData == null) {
            // Fetch data from source
            var data = await FetchDataFromSource();

            // Cache the data with options
            var options = new DistributedCacheEntryOptions {
                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30),
                SlidingExpiration = TimeSpan.FromMinutes(5)
            };

            await _cache.SetStringAsync(key, data, options);
            return data;
        }

        return cachedData;
    }
}

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

IDistributedCache arabirimini kullanmak için uygulamada IDistributedCache örneği isteyin. Örnek, bağımlılık enjeksiyonu (DI) tarafından sağlanır.

Örnek uygulama başlatıldığında IDistributedCache, Program.cs içine eklenir. IHostApplicationLifetime kullanılarak geçerli zaman önbelleğe alınır (daha fazla bilgi için bkz: Genel Ana Bilgisayar: 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, IDistributedCache öğesini IndexModel'e enjekte eder ve bu, Dizin sayfası tarafından kullanılır.

Dizin sayfası her yüklendiğinde, OnGetAsync içindeki önbelleğe alınmış süre için önbellek denetlenir. Ö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üğme, OnPostResetCachedTime işleyici yöntemini tetikler.

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

Gerek yok, dahilî uygulamaları kullanırken IDistributedCache örnekleri için Singleton veya Scoped yaşam döngüsü kullanmaya gerek yok.

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.

Recommendations

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
  • Cost
  • 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:

  • Çoklu sunuculara yapılan isteklerde tutarlıdır (tutarlıdır).
  • Sunucu yeniden başlatmalarına ve uygulama dağıtımlarına rağmen ayakta kalır.
  • Yerel bellek kullanmaz.

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

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

Prerequisites

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.

Postgres dağıtılmış önbelleğini kullanmak için Microsoft.Extensions.Caching.Postgres 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 arabirim

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

IDistributedCache uygulamasını Startup.ConfigureServices içinde kaydedin. Çerçevenin sağladığı uygulamalar bu konuda şöyle açıklanmıştı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, DevelopmentStartup.ConfigureServices ortamında çalıştırıldığında Dağıtılmış Bellek Önbelleği'ni kullanı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

Note

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

Örnek uygulama, SqlServerCache-olmayan bir ortamda Development uygular Startup.ConfigureServices:

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

Note

(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. Redis için bir Azure Önbelleği 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ış Postgres Önbelleği

PostgreSQL için Azure Veritabanı , arabirim aracılığıyla IDistributedCache dağıtılmış önbellek yedekleme deposu olarak kullanılabilir. PostgreSQL için Azure Veritabanı, öngörülebilir performans, güçlü güvenlik, yüksek kullanılabilirlik ve sorunsuz ölçeklenebilirlik özelliklerine sahip görev açısından kritik iş yüklerini desteklemek üzere tasarlanmış, açık kaynak PostgreSQL altyapısı üzerinde oluşturulmuş, tam olarak yönetilen, AI'ye hazır bir Hizmet Olarak Veritabanı (DBaaS) teklifidir.

Microsoft.Extensions.Caching.Postgres NuGet paketini yükledikten sonra, dağıtılmış önbelleğinizi aşağıdaki gibi yapılandırın:

  1. Hizmeti Kaydetme
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

// Register Postgres distributed cache
builder.Services.AddDistributedPostgresCache(options => {
    options.ConnectionString = builder.Configuration.GetConnectionString("PostgresCache");
    options.SchemaName = builder.Configuration.GetValue<string>("PostgresCache:SchemaName", "public");
    options.TableName = builder.Configuration.GetValue<string>("PostgresCache:TableName", "cache");
    options.CreateIfNotExists = builder.Configuration.GetValue<bool>("PostgresCache:CreateIfNotExists", true);
    options.UseWAL = builder.Configuration.GetValue<bool>("PostgresCache:UseWAL", false);

    // Optional: Configure expiration settings

    var expirationInterval = builder.Configuration.GetValue<string>("PostgresCache:ExpiredItemsDeletionInterval");
    if (!string.IsNullOrEmpty(expirationInterval) && TimeSpan.TryParse(expirationInterval, out var interval)) {
        options.ExpiredItemsDeletionInterval = interval;
    }

    var slidingExpiration = builder.Configuration.GetValue<string>("PostgresCache:DefaultSlidingExpiration");
    if (!string.IsNullOrEmpty(slidingExpiration) && TimeSpan.TryParse(slidingExpiration, out var sliding)) {
        options.DefaultSlidingExpiration = sliding;
    }
});

var app = builder.Build();
  1. Önbelleği Kullanma
public class MyService {
    private readonly IDistributedCache _cache; 

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

    public async Task<string> GetDataAsync(string key) {
        var cachedData = await _cache.GetStringAsync(key);

        if (cachedData == null) {
            // Fetch data from source
            var data = await FetchDataFromSource();

            // Cache the data with options
            var options = new DistributedCacheEntryOptions {
                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30),
                SlidingExpiration = TimeSpan.FromMinutes(5)
            };

            await _cache.SetStringAsync(key, data, options);
            return data;
        }

        return cachedData;
    }
}

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

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

Örnek uygulama başlatıldığında IDistributedCache, Startup.Configure içine eklenir. IHostApplicationLifetime kullanılarak geçerli zaman önbelleğe alınır (daha fazla bilgi için bkz: Genel Ana Bilgisayar: 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, IDistributedCache öğesini IndexModel'e enjekte eder ve bu, Dizin sayfası tarafından kullanılır.

Dizin sayfası her yüklendiğinde, OnGetAsync içindeki önbelleğe alınmış süre için önbellek denetlenir. Ö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üğme, OnPostResetCachedTime işleyici yöntemini tetikler.

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

Note

Yerleşik uygulamalar için IDistributedCache örnekleri için Singleton veya Scoped 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.

Recommendations

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
  • Cost
  • 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