Memory Cache Kullanımı

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.

ttmind
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;

    Öncelikle
    dotnet new mvc
    ile web projemizi oluşturalım. Burada startup.cs altına gelerek in-memory cache yapısını kullanmamızı sağlayan servisi register edelim.
    services.AddMemoryCache();
    Daha sonra Cacheleri okuyacağımız servis interfacemizi yazarak cache metotlarımızı belirtelim.
    using 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.
    using 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.
        public class HomeController : Controller
        {        
            private readonly IMemoryCacheService _memoryCacheService;        
    
            public HomeController(IMemoryCacheService memoryCacheService)
            {            
                _memoryCacheService = memoryCacheService;            
            }
            
            public IActionResult Index()
            {
                var teamSquad = _memoryCacheService.GetTeamSquad();
                return View(teamSquad);
            }
        }
    @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.

    Kaynaklar

    https://docs.microsoft.com/tr-tr/aspnet/core/performance/caching/memory?view=aspnetcore-5.0

Written By

Bir önceki günden daha iyi olmak için çalışarak kendimi geliştirmek, öğrendiklerim ve öğreneceklerim ile yazılım sektöründe büyük ölçekli ve uluslararası projelerde kendimden söz ettirmek istiyorum.

More From Author

You May Also Like

6 comments

Murat says:

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.

Yusuf says:

Eline Emeğine Sağlık

Emre says:

Bende bir kaç soru işareti oluştu. Rica etsem cevaplarmısınız?
1- Memory cache e aldığımız data, tüm clientlere ortak mı yoksa her cliente ayrı bir cache mi oluşturuluyor ?
2 – Yukarıdaki örnekteki _memoryCache nesnesindeki tüm veriyi tek seferde nasıl boşaltabilirim ? Yani _memoryCache .Clear() gibi bir kullanım varmı ? Buna neden ihtiyaç duyuyorum ? İhtiyaç halinde bir metod sayesinde bu cache silip yeniden güncellemek için.
3 – Örneğinizde bulunmasada _memoryCache nesnesinde CreateEntry adında bir metod var . Kullanımından bir kaç cümle ile bahsedebilirmisiniz.

Merhaba Emre elimden geldiğince cevaplamaya çalışayım,

Memory cache instance bazındadır yanı redis gibi distributed olarak kullanılmaz bulunduğu yerdeki ramde saklanır. Yani 3 instance lı bir yapıda 3 ününde memorycache ayrıdır. Çok büyük veriler atılmamalıdır.
Tüm veriyi boşaltmak için clear extensionını deneyebilirsin, bununla beraber keyleri gezerek remove da yapabilirsin.
Createentry kullanımı için biraz araştırma yaparak örneklere bakabilirsin temelde verilen key ile ICacheEntry interface instanse döner https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.caching.memory.imemorycache.createentry?view=dotnet-plat-ext-7.0

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir