Örnek projeyi github üzerinden indirmek veya görüntülemek için https://github.com/ayzdru/AspNetInMemoryAndDistributedCaching adresine gidebilirsiniz.
Cache (Önbellek) Nedir?
Hesaplanmış verileri veya hızlı erişmemiz gereken verileri, veri depolayan bir donanım ve yazılım aracılığıyla saklama işlemdir. Günümüzde aynı sonuçları döndüren kayıtları doğru yer ve zamanda önbelleğe alarak kaynak tüketimi ve işlem hızını artırabiliriz.
Tek Sunucuda çalışan sistemlerde kullanılan önbellekleme yöntemidir. Birden fazla sunucu olduğunda ayrı ayrı önbellekleme yapılacağı için veriler tutarsız olacaktır. Eğer Load Balancer (Yük Dengeleme) ile aynı kullanıcı isteklerini aynı sunucuya gönderme (Sticky Session) gibi bir yöntem kullanırsak, veri tutarsızlığı sorununu aynı kullanıcı için çözecektir.
Birden fazla sunucuya sahip olabilen sistemlerde, ortak bir cache server ile dağıtılmış bir biçimde kullanılan önbellekleme yöntemidir.
Distributed Caching

Distributed Caching'in In-Memory Caching (Local Caching) yerine kullanılmasının sebebi ölçeklenebilirlik ve tutarlılıktır. Sunuculardan herhangi biri down olsa bile Cache Server ayakta olduğu sürece cache altyapısı çalışacaktır. Tabi ki felaket senaryolarına göre sunucularımızın erişebilirliğini artırmak bize kalmış bir şeydir.
Distributed Memory Cache
Önbelleğe alınan değerler, uygulamanın çalıştığı sunucudaki uygulama örneği üzerinde saklanır. Aslında tam olarak dağıtık bir yapı değildir.
Tavsiye edilen kullanım alanları:
- Development ve Test senaryoları
- Herhangi bir bölümünün çalışmadığında, sistemin çalışmaya devam edebilmesi gerektiğinde
Startup.cs dosyasında kullanımı
services.AddDistributedMemoryCache();
Distributed SQL Server Cache
Öncelikle dotnet sql-cache create "ConnectionString" SchemaName TableName komutu ile gerekli veritabanı ve tablomuzu oluşturuyoruz.
dotnet sql-cache create "Server=(local);Database=DistributedSQLServerCache;Trusted_Connection=True;" dbo TestCache
Startup.cs dosyasında kullanımı
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString =
_config["DistributedSQLServerCache"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
Distributed Redis Cache
Redis dağıtık önbellekleme olarak sıklıkla kullanılan açık kaynaklı in-memory veri deposudur.
Redis Kurulumu:
- Redis'i indiriyoruz
- cmd üzerinden redis-server komutunu çalıştırıyoruz.
Startup.cs dosyasında kullanımı
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
Distributed NCache Cache
NCache .Net ile geliştirilen in-memory dağıtık önbellekleme için kullanılan açık kaynaklı bir projedir.
NCache Kurulumu:
Startup.cs dosyasında kullanımı
services.AddNCacheDistributedCache(configuration =>
{
configuration.CacheName = "demoClusteredCache";
configuration.EnableLogs = true;
configuration.ExceptionsEnabled = true;
});
Kodlamaya Başlayalım
WeatherForecast.cs classımızı oluşturuyoruz.
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
Startup.cs dosyasında uygulama başlatıldığında Distributed Cache ve Memory Cache ilk değerlerini atıyoruz.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime, IDistributedCache cache, IMemoryCache memoryCache)
{
lifetime.ApplicationStarted.Register(() =>
{
var options = new DistributedCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromSeconds(20));
var weatherForecast = new WeatherForecast
{
Date = DateTime.Now,
Summary = "Freezing",
TemperatureCelsius = -20
};
memoryCache.Set("WeatherForecast", weatherForecast);
var jsonString = JsonSerializer.Serialize(weatherForecast);
cache.SetString("WeatherForecast", jsonString, options);
});
}
Memory Cache Kullanımı
MemoryCache.cshtml.cs dosyasını düzenliyoruz
public class MemoryCacheModel : PageModel
{
private readonly ILogger<MemoryCacheModel> _logger;
private readonly IMemoryCache _memoryCache;
public MemoryCacheModel(ILogger<MemoryCacheModel> logger, IMemoryCache memoryCache)
{
_logger = logger;
_memoryCache = memoryCache;
}
public WeatherForecast WeatherForecast { get; set; }
public void OnGet()
{
_memoryCache.TryGetValue<WeatherForecast>("WeatherForecast", out WeatherForecast weatherForecast);
if (weatherForecast !=null)
{
WeatherForecast = weatherForecast;
}
}
}
Distributed Cache Kullanımı
DistributedCache.cshtml.cs dosyasını düzenliyoruz
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
private readonly IDistributedCache _distributedCache;
public IndexModel(ILogger<IndexModel> logger, IDistributedCache distributedCache)
{
_logger = logger;
_distributedCache = distributedCache;
}
public WeatherForecast WeatherForecast { get; set; }
public async Task OnGetAsync()
{
var weatherForecastJsonString = await _distributedCache.GetStringAsync("WeatherForecast");
if (weatherForecastJsonString != null)
{
WeatherForecast = JsonSerializer.Deserialize<WeatherForecast>(weatherForecastJsonString);
}
}
}
Mutlu kodlamalar.. :)