Merhaba arkadaşlar, bugün sizlere .Net Core (net 5.0) bir projede memory cache kullanarak verimizi nasıl cacheleriz bundan bahsedeceğim. Örneğe geçmeden önce Cache yapısına neden ihtiyaç duyuyoruz ondan bahsetmek gerekir.

Verimiz belirli periyotlarda güncelleniyorsa biz bu veriyi her seferinde yeniden çekme maliyetinden kurtulmak adına cache sistemlerini kullanabiliriz.
Daha basit bir örnekle anlatmak gerekirse;
Futbol takımlarının oyuncu listesi transfer döneminden, diğer transfer dönemine kadar geçerlidir. (Bazı istisnalar olabiliyor ama oralara girmeyelim şimdi 😀 )
Cache kullanılmayan bir yapıda;
- Her oyuncu listesine bakmak istediğimizde, futbol takımından oyuncu listesini isteyerek, onlardan gelecek cevabı bekler ve cevap gelince listeye bakabiliriz.
Cache kullanılan bir yapıda;
- Kadro kayıt süreleri bittiğinde futbol takımından oyuncu listesini bir kere isteriz ve her oyuncu listesine bakmak istediğimizde bunu kullanabiliriz. Kadroların değiştiği yeni dönemde ise tekrar bir liste isteriz.
bence-balla-schottner-unsplash Basit bir şekilde cache neden ihtiyaç duyduğumuzu açıklamaya çalıştım.
Şimdi geçelim .Net Core ile beraber nasıl in-memory cache yapısını kullanabileceğimize;Öncelikle1dotnet new mvcile web projemizi oluşturalım. Burada startup.cs altına gelerek in-memory cache yapısını kullanmamızı sağlayan servisi register edelim.1services.AddMemoryCache();Daha sonra Cacheleri okuyacağımız servis interfacemizi yazarak cache metotlarımızı belirtelim.123456789using MemoryCacheAndPartialCache.Models;namespace MemoryCacheAndPartialCache.Services{public interface IMemoryCacheService{TeamSquad GetTeamSquad();}}Şimdi asıl işi yaptığımız, verileri cacheden okuduğumuz eğer cache de yoksa veriyi çekerek cache aktardığımız, IMemoryCache den kalıtım alan MemoryCacheServisimizi yazalım.1234567891011121314151617181920212223242526272829303132333435363738using System;using System.Collections.Generic;using MemoryCacheAndPartialCache.Models;using MemoryCacheAndPartialCache.Services;using Microsoft.Extensions.Caching.Memory;namespace MemoryCacheAndPartialCache.Services{public class MemoryCacheService : IMemoryCacheService{private readonly IMemoryCache _memoryCache;private readonly ITeamService _teamService;public MemoryCacheService(IMemoryCache memoryCache, ITeamService teamService){_memoryCache = memoryCache;_teamService = teamService;}public TeamSquad GetTeamSquad(){var cacheKey = "teamSquad";if (_memoryCache.TryGetValue(cacheKey, out TeamSquad teamSquad)){return teamSquad;}else{var players = _teamService.GetPlayers();var teamSquadPlayers = new TeamSquad {CheckTime = DateTime.Now,Players = players};_memoryCache.Set(cacheKey, teamSquadPlayers, TimeSpan.FromMinutes(1));return teamSquadPlayers;}}}}Artık Home Controller altında IMemoryCacheService kullanarak kadromuzu çekerek ekranda gösterebiliriz.123456789101112131415public class HomeController : Controller{private readonly IMemoryCacheService _memoryCacheService;public HomeController(IMemoryCacheService memoryCacheService){_memoryCacheService = memoryCacheService;}public IActionResult Index(){var teamSquad = _memoryCacheService.GetTeamSquad();return View(teamSquad);}}
12345678910111213141516171819@model TeamSquad@{ViewData["Title"] = "Home Page";}<table><h1> CheckTime is @Model.CheckTime.ToString()</h1><tr><td>Id</td><td>Name</td></tr>@foreach (var player in Model.Players){<tr><td>@player.Id</td><td>@player.Name</td></tr>}</table>Umarım faydalı bir yazı olmuştur. İlgili kaynağı ve projenin kaynak kodunu aşağıda paylaşıyorum. Herkese sağlıklı günler dilerim.Kaynak Kod => https://github.com/EnesAys/MemoryCacheAndPartialCache
Kaynaklar
https://docs.microsoft.com/tr-tr/aspnet/core/performance/caching/memory?view=aspnetcore-5.0
Elinize sağlık. Şöyle bir bilgi eklemek isterim.
IMemoryCache – Web sunucusunun belleğini kullanan en basit önbellek biçimi.
Bu dikkate alınmaz ise sunucu şişmesine ve performans kaybına sebep olur.
Haklısınız, zaten ihtiyaca göre Redis gibi dağıtık cache yapıları ve benzeri teknolojiler kullanılabilir. Burada daha basit bir kullanım için örnek vermek istedim. Yoksa cachelenecek senaryo ve yük kesinlikle mimariyi planlarken dikkate alınmalıdır.