ASP.NET Core 'de dağıtılmış önbelleğe alma
Düzenleyen/ mohsin Nasir ve Steve Smith
Dağıtılmış önbellek, genellikle ona erişen uygulama sunucuları için bir dış hizmet olarak tutulan birden çok uygulama sunucusu tarafından paylaşılan bir önbellektir. dağıtılmış önbellek, özellikle uygulama bir bulut hizmeti veya sunucu grubu tarafından barındırıldığı zaman bir ASP.NET Core uygulamasının performansını ve ölçeklenebilirliğini iyileştirebilir.
Dağıtılmış bir önbellek, önbelleğe alınan verilerin ayrı uygulama sunucularında depolandığı diğer önbelleğe alma senaryolarından daha fazla avantaj sunar.
Önbelleğe alınan veriler dağıtıldığında, veriler:
- Birden çok sunucuya yönelik istekler arasında tutarlı (tutarlı ).
- Sunucu yeniden başlatmaları ve uygulama dağıtımları.
- Yerel bellek kullanmaz.
Dağıtılmış önbellek yapılandırması uygulamaya özgüdür. bu makalede SQL Server ve redsıs dağıtılmış önbelleklerinin nasıl yapılandırılacağı açıklanır. NCache (GitHub üzerindeki nCache) gibi üçüncü taraf uygulamalar da mevcuttur. Uygulama hangi uygulamanın seçildiğine bakılmaksızın, arabirimi kullanılarak önbellek ile etkileşime girer IDistributedCache .
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
Önkoşullar
SQL Server dağıtılmış önbellek kullanmak için Microsoft. Extensions. Önbelleğe Alma bir paket başvurusu ekleyin. SqlServer paketi.
redsıs dağıtılmış önbelleği kullanmak için Microsoft. Extensions. Önbelleğe Alma bir paket başvurusu ekleyin. StackExchangeRedis paketi.
ncache dağıtılmış önbelleği kullanmak için ncache. Microsoft. Extensions. Önbelleğe Alma 'ye bir paket başvurusu ekleyin. OpenSource paketi.
Idistributedcache arabirimi
IDistributedCacheArabirim, 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 öğeyi dizi olarak alır
byte[]. - Set, SetAsync :
byte[]Bir dize anahtarı kullanarak önbelleğe bir öğe (dizi olarak) ekler. - Refresh, RefreshAsync : Önbellekte bir öğeyi anahtarını temel alarak yeniler, Kayan süre sonu zaman aşımını (varsa) sıfırlarken.
- Remove, RemoveAsync : Bir önbellek öğesini dize anahtarına göre kaldırır.
Dağıtılmış önbelleğe alma hizmetleri oluşturma
Uygulamasına bir uygulamasını kaydetme IDistributedCache Startup.ConfigureServices . Bu konuda açıklanan Framework tarafından sunulan uygulamalar şunlardır:
- Dağıtılmış bellek önbelleği
- dağıtılmış SQL Server önbelleği
- Dağıtılmış Redsıs ö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ğlanmış bir uygulamasıdı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ığı sunucuda uygulama örneği tarafından depolanır.
Dağıtılmış bellek önbelleği, yararlı bir uygulama:
- Geliştirme ve test senaryolarında.
- Üretimde tek bir sunucu kullanıldığında ve bellek tüketimi bir sorun değildir. Dağıtılmış bellek önbelleğinin uygulanması, önbelleğe alınmış veri depolamayı soyutlar. Birden çok düğüm veya hata toleransı gerekliyse, gelecekte doğru bir dağıtılmış önbelleğe alma çözümü uygulamaya olanak sağlar.
Örnek uygulama, uygulamasında geliştirme ortamında uygulama çalıştırıldığında dağıtılmış bellek önbelleğinin kullanımını sağlar Startup.ConfigureServices :
services.AddDistributedMemoryCache();
dağıtılmış SQL Server önbelleği
dağıtılmış SQL Server önbellek uygulama ( AddDistributedSqlServerCache ) dağıtılmış önbelleğin, kendi yedekleme deposu olarak bir SQL Server veritabanı kullanmasına izin verir. bir SQL Server örneğinde önbelleğe alınmış SQL Server bir öğe tablosu oluşturmak için sql-cache aracını kullanabilirsiniz. Araç, belirttiğiniz ad ve şemaya sahip bir tablo oluşturur.
komutunu çalıştırarak SQL Server tablo oluşturun sql-cache create . SQL Server örneği ( Data Source ), veritabanı (), Initial Catalog şema (örneğin,) dbo ve tablo adı (örneğin, TestCache ) sağlayın:
dotnet sql-cache create "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache
Aracın başarılı olduğunu göstermek için bir ileti günlüğe kaydedilir:
Table and index were created successfully.
Araç tarafından oluşturulan tablo sql-cache aşağıdaki şemaya sahiptir:

Not
Bir uygulama, bir örneğini kullanarak önbellek değerlerini işlemelidir IDistributedCache SqlServerCache .
Örnek uygulama, SqlServerCache Içinde geliştirme dışı bir ortamda uygular Startup.ConfigureServices :
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString =
_config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
Not
ConnectionString(Ve isteğe bağlı olarak, SchemaName ve TableName ) genellikle kaynak denetimi dışında (örneğin, gizli yönetici veya appSettings içinde depolanır appsettings.json / . { ENVIRONMENT}. JSON dosyaları). Bağlantı dizesinde kaynak denetim sistemlerinden tutulması gereken kimlik bilgileri bulunabilir.
Dağıtılmış Redis Cache
Redsıs , genellikle dağıtılmış önbellek olarak kullanılan açık kaynaklı bir bellek içi veri deposudur. Azure 'da barındırılan ASP.NET Core uygulaması için bir Azure Redis Cache yapılandırabilir ve yerel geliştirme için bir Azure Redis Cache kullanabilirsiniz.
Bir uygulama bir RedisCache örnek () kullanarak önbellek uygulamasını yapılandırır AddStackExchangeRedisCache .
- Redsıs için bir Azure önbelleği oluşturun.
- Birincil bağlantı dizesini (StackExchange. Redsıs) yapılandırmayakopyalayın.
- Yerel geliştirme: bağlantı dizesini gizli yöneticiile kaydedin.
- Azure: bağlantı dizesini App Service yapılandırmasına veya başka bir güvenli depoya kaydedin.
Aşağıdaki kod Redsıs için Azure önbelleğini sunar:
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 kod, birincil bağlantı dizesinin (StackExchange. Redsıs) yapılandırma için anahtar adı ile kaydedildiğini varsayar MyRedisConStr .
Daha fazla bilgi için bkz. Redis için Azure Cache.
bu GitHub, yerel bir redsıs önbelleğine yönelik alternatif yaklaşımlar hakkında bir tartışma için bu konuya bakın.
Dağıtılmış NCache önbelleği
NCache , .NET ve .NET Core 'da yerel olarak geliştirilen açık kaynaklı bellek içi dağıtılmış bir önbellektir. ncache hem yerel olarak hem de Azure 'da veya diğer barındırma platformlarında çalışan bir ASP.NET Core uygulama için dağıtılmış önbellek kümesi olarak yapılandırılmış şekilde çalışır.
yerel makinenizde ncache 'i yüklemek ve yapılandırmak için bkz. Windows için başlarken kılavuzu (.net ve .net Core).
NCache 'yi yapılandırmak için:
NCache açık kaynak NuGet'yi yükler.
Cache kümesini Client. ncconf' de 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 kullan
Arabirimini kullanmak için IDistributedCache , IDistributedCache uygulamadaki herhangi bir oluşturucudan bir örnek isteyin. Örnek, bağımlılık ekleme (dı)tarafından sağlanır.
Örnek uygulama başlatıldığında IDistributedCache öğesine eklenir Startup.Configure . Şu anki süre kullanılarak önbelleğe alındı IHostApplicationLifetime (daha fazla bilgi için bkz. genel konak: ıhostapplicationlifetime):
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 , IndexModel Dizin sayfası tarafından kullanılmak üzere içine çıkarır.
Dizin sayfası her yüklendiğinde, önbellek, içindeki önbelleğe alınmış zamana göre denetlenir OnGetAsync . Önbelleğe alınmış sürenin süresi dolmamışsa, zaman görüntülenir. Önbelleğe alınan saate son erişildiği zamandan bu yana 20 saniye geçtikten sonra (bu sayfanın son yüklenilişinde), sayfanın önbelleğe alınma süresi doldu.
Önbelleğe alınmış süreyi Sıfırla ' yı seçerek önbelleğe alınmış zamanı geçerli saate hemen güncelleştirin. Düğme OnPostResetCachedTime işleyici metodunu 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();
}
}
Not
Örnekler için tek veya kapsamlı bir yaşam süresi kullanmanız gerekmez IDistributedCache (en azından yerleşik uygulamalar için).
Ayrıca IDistributedCache , dı kullanmak yerine bir örnek oluşturabilirsiniz, ancak kodda bir örnek oluşturmak kodunuzu test etmek ve Açık bağımlılıklar ilkesiniihlal etmek için daha zor hale gelebilir.
Öneriler
IDistributedCacheUygulamanız için hangi uygulamanın en iyisi 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ınmış verilerin hızlı bir şekilde alınmasını sağlamak için bellek içi depolamaya dayanır, ancak bellek sınırlı bir kaynaktır ve genişleyebilir. Yalnızca yaygın olarak kullanılan verileri bir önbellekte depolayın.
genellikle, redsıs önbelleği daha yüksek aktarım hızı ve bir SQL Server önbelleğinden daha düşük gecikme süresi sağlar. Bununla birlikte, genellikle önbelleğe alma stratejilerinin performans özelliklerini belirlemede bir değerlendirme gerekir.
SQL Server dağıtılmış önbellek yedekleme deposu olarak kullanıldığında, önbellek için aynı veritabanını kullanın ve uygulamanın sıradan veri depolama ve alma, her ikisinin performansını olumsuz yönde etkileyebilir. dağıtılmış önbellek yedekleme deposu için adanmış bir SQL Server örneği kullanmanızı öneririz.
Ek kaynaklar
- Azure üzerinde Redis Cache
- Azure’da SQL Database
- Web çiftlerine ncache için ıdistributedcache sağlayıcısını ASP.NET Core (GitHub üzerindeki ncache)
- ASP.NET Core 'de önbellek belleği
- ASP.NET Core'de değişiklik belirteçleriyle değişiklikleri ASP.NET Core
- ASP.NET Core 'de yanıt önbelleğe alma
- ASP.NET Core'Önbelleğe Alma Ara Yazılımına yanıt ASP.NET Core
- ASP.NET Core MVC 'de önbellek etiketi yardımcısı
- ASP.NET Core dağıtılmış önbellek etiketi Yardımcısı
- Web ASP.NET Core konak grubu
Dağıtılmış önbellek, genellikle ona erişen uygulama sunucuları için bir dış hizmet olarak tutulan birden çok uygulama sunucusu tarafından paylaşılan bir önbellektir. dağıtılmış önbellek, özellikle uygulama bir bulut hizmeti veya sunucu grubu tarafından barındırıldığı zaman bir ASP.NET Core uygulamasının performansını ve ölçeklenebilirliğini iyileştirebilir.
Dağıtılmış bir önbellek, önbelleğe alınan verilerin ayrı uygulama sunucularında depolandığı diğer önbelleğe alma senaryolarından daha fazla avantaj sunar.
Önbelleğe alınan veriler dağıtıldığında, veriler:
- Birden çok sunucuya yönelik istekler arasında tutarlı (tutarlı ).
- Sunucu yeniden başlatmaları ve uygulama dağıtımları.
- Yerel bellek kullanmaz.
Dağıtılmış önbellek yapılandırması uygulamaya özgüdür. bu makalede SQL Server ve redsıs dağıtılmış önbelleklerinin nasıl yapılandırılacağı açıklanır. NCache (GitHub üzerindeki nCache) gibi üçüncü taraf uygulamalar da mevcuttur. Uygulama hangi uygulamanın seçildiğine bakılmaksızın, arabirimi kullanılarak önbellek ile etkileşime girer IDistributedCache .
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
Önkoşullar
SQL Server dağıtılmış önbellek kullanmak için Microsoft.AspNetCore.App metapackage 'e başvurun veya Microsoft. Extensions. Önbelleğe Alma bir paket başvurusu ekleyin. SqlServer paketi.
redsıs dağıtılmış önbellek kullanmak için Microsoft.AspNetCore.App metapackage 'e başvurun ve Microsoft. Extensions. Önbelleğe Alma 'ye bir paket başvurusu ekleyin. StackExchangeRedis paketi. Redsıs paketi pakete dahil değildir, bu Microsoft.AspNetCore.App nedenle Redu paketine proje dosyanızda ayrı olarak başvurmanız gerekir.
ncache dağıtılmış önbelleği kullanmak için Microsoft.AspNetCore.App metapackage 'e başvurun ve ncache. Microsoft. Extensions. Önbelleğe Alma öğesine bir paket başvurusu ekleyin. OpenSource paketi. NCache paketi pakete dahil değildir, bu Microsoft.AspNetCore.App nedenle, proje dosyanızda ayrı olarak NCache paketine başvurmanız gerekir.
Idistributedcache arabirimi
IDistributedCacheArabirim, 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 öğeyi dizi olarak alır
byte[]. - Set, SetAsync :
byte[]Bir dize anahtarı kullanarak önbelleğe bir öğe (dizi olarak) ekler. - Refresh, RefreshAsync : Önbellekte bir öğeyi anahtarını temel alarak yeniler, Kayan süre sonu zaman aşımını (varsa) sıfırlarken.
- Remove, RemoveAsync : Bir önbellek öğesini dize anahtarına göre kaldırır.
Dağıtılmış önbelleğe alma hizmetleri oluşturma
Uygulamasına bir uygulamasını kaydetme IDistributedCache Startup.ConfigureServices . Bu konuda açıklanan Framework tarafından sunulan uygulamalar şunlardır:
- Dağıtılmış bellek önbelleği
- dağıtılmış SQL Server önbelleği
- Dağıtılmış Redsıs ö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ğlanmış bir uygulamasıdı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ığı sunucuda uygulama örneği tarafından depolanır.
Dağıtılmış bellek önbelleği, yararlı bir uygulama:
- Geliştirme ve test senaryolarında.
- Üretimde tek bir sunucu kullanıldığında ve bellek tüketimi bir sorun değildir. Dağıtılmış bellek önbelleğinin uygulanması, önbelleğe alınmış veri depolamayı soyutlar. Birden çok düğüm veya hata toleransı gerekliyse, gelecekte doğru bir dağıtılmış önbelleğe alma çözümü uygulamaya olanak sağlar.
Örnek uygulama, uygulamasında geliştirme ortamında uygulama çalıştırıldığında dağıtılmış bellek önbelleğinin kullanımını sağlar Startup.ConfigureServices :
services.AddDistributedMemoryCache();
dağıtılmış SQL Server önbelleği
dağıtılmış SQL Server önbellek uygulama ( AddDistributedSqlServerCache ) dağıtılmış önbelleğin, kendi yedekleme deposu olarak bir SQL Server veritabanı kullanmasına izin verir. bir SQL Server örneğinde önbelleğe alınmış SQL Server bir öğe tablosu oluşturmak için sql-cache aracını kullanabilirsiniz. Araç, belirttiğiniz ad ve şemaya sahip bir tablo oluşturur.
komutunu çalıştırarak SQL Server tablo oluşturun sql-cache create . SQL Server örneği ( Data Source ), veritabanı (), Initial Catalog şema (örneğin,) dbo ve tablo adı (örneğin, TestCache ) sağlayın:
dotnet sql-cache create "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache
Aracın başarılı olduğunu göstermek için bir ileti günlüğe kaydedilir:
Table and index were created successfully.
Araç tarafından oluşturulan tablo sql-cache aşağıdaki şemaya sahiptir:

Not
Bir uygulama, bir örneğini kullanarak önbellek değerlerini işlemelidir IDistributedCache SqlServerCache .
Örnek uygulama, SqlServerCache Içinde geliştirme dışı bir ortamda uygular Startup.ConfigureServices :
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString =
_config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
Not
ConnectionString(Ve isteğe bağlı olarak, SchemaName ve TableName ) genellikle kaynak denetimi dışında (örneğin, gizli yönetici veya appSettings içinde depolanır appsettings.json / . { ENVIRONMENT}. JSON dosyaları). Bağlantı dizesinde kaynak denetim sistemlerinden tutulması gereken kimlik bilgileri bulunabilir.
Dağıtılmış Redis Cache
Redsıs , genellikle dağıtılmış önbellek olarak kullanılan açık kaynaklı bir bellek içi veri deposudur. redsıs 'yi yerel olarak kullanabilir ve Azure 'da barındırılan ASP.NET Core uygulaması için bir Azure Redis Cache yapılandırabilirsiniz.
Bir uygulama, RedisCache AddStackExchangeRedisCache içinde geliştirme olmayan bir ortamda bir örnek () kullanarak önbellek uygulamasını yapılandırır Startup.ConfigureServices :
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
Redsıs 'i yerel makinenize yüklemek için:
- Chocolatey redsıs paketiniyükler.
redis-serverKomut isteminden çalıştırın.
Dağıtılmış NCache önbelleği
NCache , .NET ve .NET Core 'da yerel olarak geliştirilen açık kaynaklı bellek içi dağıtılmış bir önbellektir. ncache hem yerel olarak hem de Azure 'da veya diğer barındırma platformlarında çalışan bir ASP.NET Core uygulama için dağıtılmış önbellek kümesi olarak yapılandırılmış şekilde çalışır.
yerel makinenizde ncache 'i yüklemek ve yapılandırmak için bkz. Windows için başlarken kılavuzu (.net ve .net Core).
NCache 'yi yapılandırmak için:
NCache açık kaynak NuGet'yi yükler.
Cache kümesini Client. ncconf' de 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 kullan
Arabirimini kullanmak için IDistributedCache , IDistributedCache uygulamadaki herhangi bir oluşturucudan bir örnek isteyin. Örnek, bağımlılık ekleme (dı)tarafından sağlanır.
Örnek uygulama başlatıldığında IDistributedCache öğesine eklenir Startup.Configure . Şu anki süre kullanılarak önbelleğe alındı IApplicationLifetime (daha fazla bilgi için bkz . Web Host: ıapplicationlifetime arabirimi):
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
IApplicationLifetime 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 , IndexModel Dizin sayfası tarafından kullanılmak üzere içine çıkarır.
Dizin sayfası her yüklendiğinde, önbellek, içindeki önbelleğe alınmış zamana göre denetlenir OnGetAsync . Önbelleğe alınmış sürenin süresi dolmamışsa, zaman görüntülenir. Önbelleğe alınan saate son erişildiği zamandan bu yana 20 saniye geçtikten sonra (bu sayfanın son yüklenilişinde), sayfanın önbelleğe alınma süresi doldu.
Önbelleğe alınmış süreyi Sıfırla ' yı seçerek önbelleğe alınmış zamanı geçerli saate hemen güncelleştirin. Düğme OnPostResetCachedTime işleyici metodunu 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();
}
}
Not
Örnekler için tek veya kapsamlı bir yaşam süresi kullanmanız gerekmez IDistributedCache (en azından yerleşik uygulamalar için).
Ayrıca IDistributedCache , dı kullanmak yerine bir örnek oluşturabilirsiniz, ancak kodda bir örnek oluşturmak kodunuzu test etmek ve Açık bağımlılıklar ilkesiniihlal etmek için daha zor hale gelebilir.
Öneriler
IDistributedCacheUygulamanız için hangi uygulamanın en iyisi 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ınmış verilerin hızlı bir şekilde alınmasını sağlamak için bellek içi depolamaya dayanır, ancak bellek sınırlı bir kaynaktır ve genişleyebilir. Yalnızca yaygın olarak kullanılan verileri bir önbellekte depolayın.
genellikle, redsıs önbelleği daha yüksek aktarım hızı ve bir SQL Server önbelleğinden daha düşük gecikme süresi sağlar. Bununla birlikte, genellikle önbelleğe alma stratejilerinin performans özelliklerini belirlemede bir değerlendirme gerekir.
SQL Server dağıtılmış önbellek yedekleme deposu olarak kullanıldığında, önbellek için aynı veritabanını kullanın ve uygulamanın sıradan veri depolama ve alma, her ikisinin performansını olumsuz yönde etkileyebilir. dağıtılmış önbellek yedekleme deposu için adanmış bir SQL Server örneği kullanmanızı öneririz.
Ek kaynaklar
- Redis Cache Azure'da depolama
- Azure’da SQL Database
- ASP.NET Core Gruplarında NCache için IDistributedCache Sağlayıcısı ( GitHub üzerindeNCache)
- ASP.NET Core 'de önbellek belleği
- ASP.NET Core'de değişiklik belirteçleriyle değişiklikleri ASP.NET Core
- ASP.NET Core 'de yanıt önbelleğe alma
- ASP.NET Core'Önbelleğe Alma Ara Yazılımına yanıt ASP.NET Core
- ASP.NET Core MVC 'de önbellek etiketi yardımcısı
- ASP.NET Core dağıtılmış önbellek etiketi Yardımcısı
- Web ASP.NET Core konak grubu
Dağıtılmış önbellek, birden çok uygulama sunucusu tarafından paylaşılan ve genellikle bu sunucuya erişen uygulama sunucularına dış hizmet olarak bakımı yapılan bir önbellektir. Dağıtılmış önbellek, özellikle de uygulama bir bulut hizmeti veya sunucu grubu ASP.NET Core bir uygulamanın performansını ve ölçeklenebilirliğini geliş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 istekler arasında tutarlı (tutarlı).
- Sunucu yeniden başlatmaları ve uygulama dağıtımları ile devam ediyor.
- Yerel bellek kullanmaz.
Dağıtılmış önbellek yapılandırması uygulamaya özgü bir yapılandırmadır. Bu makalede, SQL Server ve Redis dağıtılmış önbelleklerini yapılandırma açıklanmıştır. NCache ( GitHub üzerinde NCache) gibiüçüncü taraf uygulamaları da kullanılabilir. Uygulama, hangi uygulamanın seçili olduğuna bakılmaksızın arabirimini kullanarak önbellekle IDistributedCache etkileşime geçmenizi sağlar.
Örnek kodu görüntüleme veya indirme ( nasılindir)
Önkoşullar
Dağıtılmış bir SQL Server kullanmak için, Microsoft.AspNetCore.App meta paketine bakın veya Microsoft.Extensions.Önbelleğe Alma. SqlServer paketi.
Redis dağıtılmış önbelleği kullanmak için, Microsoft.AspNetCore.App meta paketine bakın ve Microsoft.Extensions.Önbelleğe Alma. Redis paketi. Redis paketi pakete dahil değildir, bu nedenle Microsoft.AspNetCore.App Redis paketine proje dosyanıza ayrı olarak başvurabilirsiniz.
NCache dağıtılmış önbelleğini kullanmak için, Microsoft.AspNetCore.App meta paketine bakın ve NCache.Microsoft.Extensions.Önbelleğe Alma. OpenSource paketi. NCache paketi pakete dahil değildir, bu nedenle proje dosyanıza Microsoft.AspNetCore.App NCache paketine ayrı olarak başvurabilirsiniz.
IDistributedCache arabirimi
arabirimi, IDistributedCache dağıtılmış önbellek uygulamasındaki öğeleri işlemek için aşağıdaki yöntemleri sağlar:
- Get, : Bir dize anahtarını kabul eder ve önbellekte bulunursa önbelleğe alınmış bir öğeyi GetAsync
byte[]dizi olarak alır. - Set, SetAsync : Dize anahtarı kullanarak
byte[]önbelleğe bir öğe (dizi olarak) ekler. - Refresh, RefreshAsync : Önbellekte bir öğeyi anahtarına göre yeniler ve kayan süre sonu zaman aşımını sıfırlar (varsa).
- Remove, RemoveAsync : Önbellek öğesini dize anahtarına göre kaldırır.
Dağıtılmış önbelleğe alma hizmetleri kurma
uygulamasının uygulamasını 'a IDistributedCache Startup.ConfigureServices kaydetme. 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 depolar ve IDistributedCache çerçeve tarafından sağlanan bir uygulamadır. Dağıtılmış Bellek Önbelleği gerçek bir dağıtılmış önbellek değil. Önbelleğe alınan öğeler, uygulamanın çalıştırlandığı 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 ve bellek tüketiminde tek bir sunucu kullanılırken sorun değildir. Dağıtılmış Bellek Önbelleği'nin uygulanması önbelleğe alınmış veri depolama alanını soyutlar. Gelecekte birden çok düğüm veya hataya dayanıklılık gerekli olursa gerçek bir dağıtılmış önbelleğe alma çözümü uygulamaya olanak sağlar.
Örnek uygulama, içinde Geliştirme ortamında çalıştırıldığında Dağıtılmış Bellek Önbelleğini Startup.ConfigureServices kullanır:
services.AddDistributedMemoryCache();
Dağıtılmış SQL Server Önbelleği
Dağıtılmış SQL Server Önbelleği uygulaması ( ), dağıtılmış önbelleğin bir SQL Server veritabanı olarak AddDistributedSqlServerCache kullanmasını sağlar. Bir SQL Server önbelleğe alınmış öğe tablosu oluşturmak SQL Server aracı sql-cache kullanabilirsiniz. Araç, belirttiğiniz ad ve şemaya sahip bir tablo oluşturur.
komutunu çalıştırarak SQL Server içinde bir tablo sql-cache create oluşturun. Örnek SQL Server ( ), Data Source veritabanı ( Initial Catalog ), şemayı (örneğin, dbo ) ve tablo adını (örneğin, TestCache ) girin:
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 oluşturulan tablo sql-cache aşağıdaki şemaya sahip:

Not
Bir uygulama, önbellek değerlerini bir örneğini kullanarak IDistributedCache işlemeli, SqlServerCache değil.
Örnek uygulama, içinde SqlServerCache Geliştirme dışı bir ortamda Startup.ConfigureServices uygulanır:
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString =
_config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
Not
A (ve isteğe bağlı olarak ve ) genellikle kaynak denetimin dışında depolanır (örneğin, Secret Manager veya ConnectionString SchemaName TableName appsettings.json / appsettings içinde depolanır.{ ENVIRONMENT}.json dosyaları). Bağlantı dizesi, kaynak denetim sistemlerinin dışında tutulması gereken kimlik bilgilerini içerebilir.
Dağıtılmış Redis Cache
Redis, genellikle dağıtılmış önbellek olarak kullanılan bir açık kaynak bellek içinde veri deposu olarak kullanılır. Redis'i yerel olarak kullanabilir ve Azure'da barındırılan bir Redis Cache için Azure ASP.NET Core yapılandırabilirsiniz.
Uygulama, önbellek uygulamasını bir örnek () kullanarak RedisCache AddDistributedRedisCache yapılandırıyor:
services.AddDistributedRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
Redis'i yerel makinenize yüklemek için:
- Chocolatey Redis paketini yükleyin.
- Komut
redis-serveristeminden komutunu çalıştırın.
Dağıtılmış NCache Önbelleği
NCache, .NET ve .NET Core'da yerel olarak geliştirilen bir açık kaynak bellek içinde dağıtılmış önbellektir. NCache hem yerel olarak çalışır hem de Azure'da veya diğer barındırma platformlarında ASP.NET Core bir uygulama için 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 Windows (.NET ve .NET Core).
NCache'i yapılandırmak için:
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 IDistributedCache kullanmak için, uygulamanın herhangi bir IDistributedCache oluşturucusndan bir örneği isteğinde bulundurabilirsiniz. Örnek, bağımlılık ekleme (DI) tarafından sağlanır.
Örnek uygulama başlatıldığında içine IDistributedCache Startup.Configure ekli. Geçerli saat kullanılarak önbelleğe alınmış IApplicationLifetime (daha fazla bilgi için bkz. Web Ana Bilgisayarı: IApplicationLifetime arabirimi):
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
IApplicationLifetime 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 IDistributedCache sayfası tarafından kullanmak üzere içine IndexModel eklir.
Dizin sayfası her yüklendiğinde, önbellek içinde önbelleğe alınan süre için OnGetAsync denetlenir. Önbelleğe alınan süre dolmamışsa, saat görüntülenir. Önbelleğe alınan zaman (bu sayfanın en son yükleniyor olduğu zaman) tarihinden bu yana 20 saniye geçti ise, sayfada Önbelleğe Alınan Süre Doldu görüntülenir.
Önbelleğe Alınan Zamanı Sıfırla düğmesini seçerek önbelleğe alınan saati hemen geçerli saatle güncelleştirin. Düğme, işleyici yöntemini OnPostResetCachedTime 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();
}
}
Not
Örnekler için Tek veya Kapsamlı yaşam süresi kullanmaya gerek yoktur (en azından yerleşik uygulamalar IDistributedCache için).
AYRıCA DI kullanmak yerine ihtiyacınız olan her yerde bir örnek oluşturabilirsiniz, ancak kodda bir örnek oluşturmak kodunuzun testini zorlaştırabilir ve Açık Bağımlılıklar İlkesini IDistributedCache ihlal ediyor olabilir.
Öneriler
Hangi uygulamasının uygulamanıza IDistributedCache en uygun olduğuna karar verirken, aşağıdakilere dikkat edin:
- Mevcut altyapı
- Performans gereksinimleri
- Maliyet
- Takım deneyimi
Önbelleğe Alma çözümleri genellikle önbelleğe alınan verilerin hızlı alınmasını sağlamak için bellek içinde depolama kullanır, ancak bellek sınırlı bir kaynaktır ve genişlemesi maliyetlidir. Yalnızca yaygın olarak kullanılan verileri bir önbellekte depolar.
Redis önbelleği genellikle bir önbellekten daha yüksek aktarım hızı ve daha düşük gecikme SQL Server sağlar. Ancak, karşılaştırma genellikle önbelleğe alma stratejilerinin performans özelliklerini belirlemek için gereklidir.
Bu SQL Server bir dağıtılmış önbellek destek deposu olarak kullanılırsa, önbellek için aynı veritabanının ve uygulamanın normal veri depolama ve alma işlemi her ikisinin performansını olumsuz etkileyebilir. Dağıtılmış önbellek destek deposu SQL Server ayrılmış bir depolama örneği kullanılması önerilir.
Ek kaynaklar
- Redis Cache Azure'da depolama
- Azure’da SQL Database
- ASP.NET Core Gruplarında NCache için IDistributedCache Sağlayıcısı (GitHub )
- ASP.NET Core 'de önbellek belleği
- ASP.NET Core'de değişiklik belirteçleriyle değişiklikleri ASP.NET Core
- ASP.NET Core 'de yanıt önbelleğe alma
- ASP.NET Core'Önbelleğe Alma Ara Yazılımına yanıt ASP.NET Core
- ASP.NET Core MVC 'de önbellek etiketi yardımcısı
- ASP.NET Core dağıtılmış önbellek etiketi Yardımcısı
- Web ASP.NET Core konak grubu