Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 9 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, Redis veya Postgres dağıtılmış önbelleklerinin nasıl yapılandırıldığı açıklanır. NCache (GitHub'da NCache), Cosmos DB ve Postgres 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)
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:
- Redis dağıtılmış önbelleği için Microsoft.Extensions.Caching.StackExchangeRedis.
- SQL Server, Microsoft.Extensions.Caching.SqlServer için.
- Postgres için, Microsoft.Extensions.Caching.Postgres.
- Cosmos DB için Microsoft.Extensions.Caching.Cosmos.
- NCache dağıtılmış önbelleği için, NCache.Microsoft.Extensions.Caching.OpenSource.
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
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
- Dağıtılmış Bellek Önbelleği
- Dağıtılmış SQL Server önbelleği
- Dağıtılmış Postgres önbelleği
- Dağıtılmış NCache önbelleği
- Dağıtılmış Azure Cosmos DB ö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ı RedisCacheyaparak bir AddStackExchangeRedisCache ö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 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:
Note
Bir uygulama önbellek değerlerini bir örneğini IDistributedCachekullanarak işlemelidir, değil SqlServerCache.
Örnek uygulama içinde Geliştirme olmayan bir ortamda SqlServerCacheuygulanırProgram.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:
- 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();
- Ö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'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.
NCache'i yerel makinenize yüklemek ve yapılandırmak için bkz. Windows ve Linux için Başlarken Kılavuzu.
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.csdosyasına ekleyin:
builder.Services.AddNCacheDistributedCache(configuration =>
{
configuration.CacheName = "democache";
configuration.EnableLogs = true;
configuration.ExceptionsEnabled = true;
});
Dağıtılmış Azure Cosmos DB Ö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 IDistributedCache eklerIndexModel.
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();
}
}
.
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
- Azure'da Redis Cache
- Azure'da SQL Veritabanı
- PostgreSQL için Azure 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, 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 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)
Prerequisites
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.
Postgres için, Microsoft.Extensions.Caching.Postgres.
NCache dağıtılmış önbelleği için, NCache.Microsoft.Extensions.Caching.OpenSource.
-
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ı.
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
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
- Dağıtılmış Bellek Önbelleği
- Dağıtılmış SQL Server önbelleği
- Dağıtılmış Postgres ö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 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:
Note
Bir uygulama önbellek değerlerini bir örneğini IDistributedCachekullanarak işlemelidir, değil SqlServerCache.
Örnek uygulama içinde Geliştirme olmayan bir ortamda SqlServerCacheuygulanırProgram.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:
- 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();
- Ö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:
- NCache açık kaynak NuGet'i yükleyin.
- client.ncconf dosyasında önbellek kümesini yapılandırın.
- Aşağıdaki kodu
Program.csdosyası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 IDistributedCache eklerIndexModel.
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();
}
}
.
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
- Azure'da Redis Cache
- Azure'da SQL Veritabanı
- PostgreSQL için Azure 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, 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 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)
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
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ış SQL Server önbelleği
- Dağıtılmış Redis önbelleği
- Dağıtılmış Postgres ö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.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:
Note
Bir uygulama önbellek değerlerini bir örneğini IDistributedCachekullanarak işlemelidir, değil SqlServerCache.
Örnek uygulama içinde Geliştirme olmayan bir ortamda SqlServerCacheuygulanırStartup.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.
- 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 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:
- 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();
- Ö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:
NCache açık kaynak NuGet'i yükleyin.
client.ncconf dosyasında önbellek kümesini yapılandırın.
Aşağıdaki kodu
Startup.ConfigureServicesdosyası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 IDistributedCache eklerIndexModel.
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();
}
}
Note
Ö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.
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
- Azure'da Redis Cache
- Azure'da SQL Veritabanı
- PostgreSQL için Azure 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