ASP.NET Core'da dağıtılmış önbelleğe alma
Tarafından Mohsin Nasir and smandia
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.
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:
- Redis dağıtılmış önbelleği için Microsoft.Extensions.Caching.StackExchangeRedis.
- SQL Server, Microsoft.Extensions.Caching.SqlServer için.
- NCache dağıtılmış önbelleği için, NCache.Microsoft.Extensions.Caching.OpenSource.
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.cs
kaydedin. Bu konuda açıklanan çerçeve tarafından sağlanan uygulamalar şunlardır:
- Dağıtılmış Redis önbelleği
- Dağıtılmış Bellek Önbelleği
- Dağıtılmış SQL Server önbelleği
- Dağıtılmış NCache önbelleği
- Dağıtılmış Azure CosmosDB önbelleği
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
.
- bir Redis için Azure Cache oluşturun.
- Birincil bağlantı dizesi (StackExchange.Redis) Yapılandırma'ya kopyalayın.
- Yerel geliştirme: gizli dizi yöneticisi ile bağlantı dizesi kaydedin.
- Azure: bağlantı dizesi Azure Key Vault gibi güvenli bir depoya 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 kodda Birincil bağlantı dizesi (StackExchange.Redis) anahtar adıyla MyRedisConStr
yapı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.cs
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 Source
Initial 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:
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.cs
uygulanı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:
- NCache açık kaynak NuGet'i yükleyin.
- client.ncconf dosyasında önbellek kümesini yapılandırın.
- 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
- Azure'da Redis Cache
- Azure'da SQL Veritabanı
- Web Gruplarında NCache için ASP.NET Core IDistributedCache Sağlayıcısı (GitHub'da NCache)
- Microsoft.Extensions.Caching.Cosmos için Depo README dosyası
- ASP.NET Core'da bellek içi önbellek
- ASP.NET Core'da değişiklik belirteçleriyle değişiklikleri algılama
- ASP.NET Core'da yanıtı önbelleğe alma
- ASP.NET Core'da Yanıt Önbelleğe Alma Ara Yazılımı
- ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı
- ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı
- Web grubunda ASP.NET Core barındırma
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:
Redis dağıtılmış önbelleği için Microsoft.Extensions.Caching.StackExchangeRedis.
SQL Server, Microsoft.Extensions.Caching.SqlServer için.
NCache dağıtılmış önbelleği için, NCache.Microsoft.Extensions.Caching.OpenSource.
-
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ı.
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.cs
kaydedin. Bu konuda açıklanan çerçeve tarafından sağlanan uygulamalar şunlardır:
- Dağıtılmış Redis önbelleği
- Dağıtılmış Bellek Önbelleği
- Dağıtılmış SQL Server önbelleği
- Dağıtılmış NCache önbelleği
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.
- bir Redis için Azure Cache oluşturun.
- Birincil bağlantı dizesi (StackExchange.Redis) Yapılandırma'ya kopyalayın.
- Yerel geliştirme: gizli dizi yöneticisi ile bağlantı dizesi kaydedin.
- Azure: bağlantı dizesi Azure Key Vault gibi güvenli bir depoya 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 kodda Birincil bağlantı dizesi (StackExchange.Redis) anahtar adıyla MyRedisConStr
yapı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.cs
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 Source
Initial 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:
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.cs
uygulanı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:
- NCache açık kaynak NuGet'i yükleyin.
- client.ncconf dosyasında önbellek kümesini yapılandırın.
- 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
- Azure'da Redis Cache
- Azure'da SQL Veritabanı
- Web Gruplarında NCache için ASP.NET Core IDistributedCache Sağlayıcısı (GitHub'da NCache)
- ASP.NET Core'da bellek içi önbellek
- ASP.NET Core'da değişiklik belirteçleriyle değişiklikleri algılama
- ASP.NET Core'da yanıtı önbelleğe alma
- ASP.NET Core'da Yanıt Önbelleğe Alma Ara Yazılımı
- ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı
- ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı
- Web grubunda ASP.NET Core barındırma
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.ConfigureServices
kaydedin. Bu konuda açıklanan çerçeve tarafından sağlanan uygulamalar şunlardır:
- Dağıtılmış Bellek Önbelleği
- Dağıtılmış SQL Server önbelleği
- Dağıtılmış Redis önbelleği
- Dağıtılmış NCache önbelleği
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.ConfigureServices
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 Source
Initial 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:
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.ConfigureServices
uygulanı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.
- bir Redis için Azure Cache oluşturun.
- Birincil bağlantı dizesi (StackExchange.Redis) Yapılandırma'ya kopyalayın.
- Yerel geliştirme: gizli dizi yöneticisi ile bağlantı dizesi kaydedin.
- Azure: bağlantı dizesi Azure Key Vault gibi güvenli bir depoya kaydedin
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 MyRedisConStr
yapı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:
NCache açık kaynak NuGet'i yükleyin.
client.ncconf dosyasında önbellek kümesini yapılandırın.
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
- Azure'da Redis Cache
- Azure'da SQL Veritabanı
- Web Gruplarında NCache için ASP.NET Core IDistributedCache Sağlayıcısı (GitHub'da NCache)
- ASP.NET Core'da bellek içi önbellek
- ASP.NET Core'da değişiklik belirteçleriyle değişiklikleri algılama
- ASP.NET Core'da yanıtı önbelleğe alma
- ASP.NET Core'da Yanıt Önbelleğe Alma Ara Yazılımı
- ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı
- ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı
- Web grubunda ASP.NET Core barındırma
ASP.NET Core