Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET Core’de In-Memory Cache

Merhaba,

Bir uygulamanın performansını önemli ölçüde arttırabilecek en mühim yapılanmalardan biriside önbelleğe(Cache) alma sistemidir. Son kullanıcıya gösterilen veriler arasından nadiren güncellenen veya geniş aralıklarla tazelenen verileri her istek neticesinde veritabanı üzerinden elde ederek kullanıcıya sunmaktansa, ilgili verileri varsa periyodik sürelere uygun bir aralıkta yahut tarafınızca belirlenmiş bir zaman sınırında önbelleğe alarak böylece orjinal veriyi tekrar elde etmek yerine daha hızlı sonuçlar üretebilirsiniz.

Asp.NET Core, modüler olarak içerisinde birkaç farklı önbellek yapılanmasını desteklemektedir. Bizler bu içeriğimizde, bu önbellek yapılanmalarından en basit olanı In-Memory Cache yapılanmasını inceleyeceğiz.

In-Memory Cache, önbellekleme sürecinde web uygulamasının barındırıldığı sunucunun belleğini kullanmaktadır ve “IMemoryCache” arayüzü aracılığıyla uygulamada çalışmaktadır.

    public interface IMemoryCache : IDisposable
    {
        ICacheEntry CreateEntry(object key);
        void Remove(object key);
        bool TryGetValue(object key, out object value);
    }

Yukarıda “IMemoryCache” arayüzünün içeriğini incelerseniz eğer “CreateEntry“, “Remove” ve “TryGetValue” metotları mevcuttur. Bu metotların sırasıyla işlevselliklerini incelersek eğer;

  • CreateEntry
    Memory Cache’de bir alan oluşturur ve içerisine değer atamamızı sağlar.
  • Remove
    Memory Cache’de oluşturulan alanı temizlelemizi sağlar.
  • TryGetValue
    Memory Cache’de belirtilen alanda varsa değeri getirir.

Asp.NET Core uygulamalarında In-Memory Cache özelliğini kullanabilmek için ilgili yapının modülünün uygulamaya service olarak eklenmesi gerekmektedir.

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddMemoryCache();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMvc();
        }
    }

Bu işlemden sonra Memory Cache’i kullanabilmek için ilgili controllerda IMemoryCache arayüzünü inject etmemiz yeterlidir.

    [Route("api/[controller]")]
    [ApiController]
    public class PersonelController : ControllerBase
    {
        IMemoryCache _memoryCache;
        NorthwindContext _northwindContext;
        public PersonelController(IMemoryCache memoryCache, NorthwindContext northwindContext)
        {
            _memoryCache = memoryCache;
            _northwindContext = northwindContext;
        }
    }

Artık Cache’lenecek verileri Memory’e atabiliriz.

    [Route("api/[controller]")]
    [ApiController]
    public class PersonelController : ControllerBase
    {
        IMemoryCache _memoryCache;
        NorthwindContext _northwindContext;
        public PersonelController(IMemoryCache memoryCache, NorthwindContext northwindContext)
        {
            _memoryCache = memoryCache;
            _northwindContext = northwindContext;
        }
        [HttpGet("[action]")]
        public ActionResult<IEnumerable<Personeller>> Get()
        {
            const string key = "personeller";

            if \(_memoryCache.TryGetValue(key, out object list))
                return Ok(list);
            var personelList = _northwindContext.Personeller.Select(x => new
            {
                x.Adi,
                x.SoyAdi,
                x.Unvan
            }).ToList();
            _memoryCache.Set(key, personelList, new MemoryCacheEntryOptions
            {
                AbsoluteExpiration = DateTime.Now.AddSeconds(20),
                Priority = CacheItemPriority.Normal
            });
            return Ok(personelList);
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer “Set” metodunun 3. parametresinde “MemoryCacheEntryOptions” tipinden bir nesne istenmektedir. Bu nesne belleğe atılan verinin temel konfigürasyonunu sağlamakta, ne kadar süre bellekte tutulacağını ve memory şiştiğinde cache objelerini hangi önceliğe göre sileceğini vs. bilgilerini tutmaktadır. Bunların dışında; yukarıda yapılan işlem neticesinde ilk request ile orjinal veri elde edilecek ve Memory Cache’e “20” saniyeliğine atılacaktır. Bu “20” saniye boyunca yapılan tüm requestler ilgili source’e gitmeksizin cacheden karşılanacaktır. Expire süresi dolan datalar ilgili cacheden temizlenecektir.

Tüm bu işlemlerin dışında Cache data set edildiği gibi remove’da edilebilmektedir.

_memoryCache.Remove(key);

Evet görüldüğü üzere bu kadar basit…

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

5 Cevaplar

  1. borahan dedi ki:

    Merhaba hocam parametreli gönderimlerde işe yaramaz sanırım 🙁 mesala bunu sanırım database üzerinde dil olaylarında kullanıyorlar galiba, belki ülkelerde kullanılır, makale için teşekkürler

    • Özkan dedi ki:

      Şu şekilde yapabilirsiniz. Aldığınız parametreyi

      [Route("/get/{id}")]
      public ActionResult(int id){
      string key = "personeller-"+id;
      if (_memoryCache.TryGetValue(key, out object list))
                  return Ok(list);
      }
      .....
      

      bu şekilde yapabilirsiniz

  2. murat dedi ki:

    Güzel bir anlatım olmuş elinize sağlık. Şöyle bir durum var ama ben mi yanlış anladım bilemiyorum. Bu Cache örnek olarak attığımız hostun kendi üzerinde oluşturulup tutuluyor. Client tarafında bir cacleme işlemi olmuyor. Doğru mudur?

  3. Yağız dedi ki:

    Yararlı oldu teşekkürler

Gençay için bir yanıt yazın Yanıtı iptal et

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