İçeriğe geç

ASP.NET Core ile Distributed Cache (Dağıtık Önbellek)

Genel olarak, önbellekleme, sık kullanılan verilerin depolandığı yerde gerçekleşir; böylece uygulamamız, kaynaktaki verilere erişmek yerine verilere hızlı bir şekilde erişebilir. Önbelleğe alma, uygulamanın performansını önemli ölçüde artırabilir ve nadir olmayan veriler için veri kaynaklarından gereksiz istekleri kaldırmamıza yardımcı olur. Asp.Net Core farklı önbellekleme tiplerini desteklemektedir.

 

Distributed Cache denilen kavram uygulamanın yüklü olduğu sunucu kaynaklarının kullanılması durumu değildir. Bu yapıda önbellek verileri merkezi olarak yönetilir ve tüm uygulama sunucuları için aynı verileri kullanmak mümkün olabilir. Bu yapının sağladığı avantajları aşağıdaki gibi görebiliriz.

  • Önbellek merkezi olarak yürütülür ve tüm kullanıcılar aynı verilere erişir.
  • Web sunucusunda herhangi bir sorun olması halinde önbellek verileri etkilenmez. Söz gelimi sunucunun yeniden başlatılması, yeni sunucu eklenmesi veya kaldırılması gibi…

Dağıtık önbellek Redis veya SQL ile yapılandırılabilir. Uygulama içinde IDistributedCache interface kullanarak önbellekle etkileşim sağlayabiliriz.

 

IDistributedCache Interface

  • Get & GetAsync: Bir key aracılığıyla önbellekten veriyi çeker. Eğer ki veri bulunmazsa boş byte[] tipi döner.
  • Set & SetAsync: İlgili kaydı belleğe byte[] tipi olarak ekler.
  • Refresh & RefreshAsync: Öğe önbellekte yenilenir.
  • Remove & RemoveAsync: İlgili key aracılığıyla veri önbellekten silinir.

 

Dağıtık Önbellekleme yapısını Asp.Net Core içinde yapılandırmak için aşağıdaki 3 adımı izleriz.

  • 1) Önbellek bağımlılıklarını(Redis veya SQL) project.json dosyasına tanımlamalıyız.
  • 2) Startup sınıfı içinde ConfigureServices metodunda ilgili önbellek tipini yapılandırmalıyız.
  • 3) Kullanacağımız ilgili önbellekleme tipi pipeline tarafında otomatik olarak enjekte edilir ve siz önbellekleme nesne örneği alarak ilgili işlemleri gerçekleştirebilirsiniz.

 

SQL Server ile Distributed Cache
Bu yöntem ile SQL Server’ı önbellek depolayan bir araç olarak kullanmak mümkündür. Bunun için öncelikle aşağıdaki yapıda bir tabloya ihtiyaç duyarız.

CREATE TABLE[dbo].[SQLCache](    
       [Id][nvarchar](449) NOT NULL,   
    [Value][varbinary](max) NOT NULL,   
    [ExpiresAtTime][datetimeoffset](7) NOT NULL,   
    [SlidingExpirationInSeconds][bigint] NULL,   
    [AbsoluteExpiration][datetimeoffset](7) NULL,   
    CONSTRAINT[pk_Id] PRIMARY KEY CLUSTERED([Id] ASC) WITH(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)   
ON[PRIMARY]) ON[PRIMARY] TEXTIMAGE_ON[PRIMARY]  

Bir sonraki aşama project.json dosyasına bağımlılıkları eklemektir. Önbellek olarak SQL sunucusunu kullanmak için projeye Microsoft.Extensions.Caching.SqlServer bağımlılığını eklemeliyiz.

 

Şimdi bu aşamada Startup sınıfı içindeki ConfigureServices metodunda bazı yapılandırmalar yapmamız gerekiyor. AddDistributedSqlServerCache metodu ile SQL Server’ı önbellek ile yapılandırırız. Burada ConnectionString, SchemaName ve TableName belirtmemiz zorunludur.

public void ConfigureServices(IServiceCollection services) {  
    services.AddMvc();  
    services.AddDistributedSqlServerCache(opt => {  
        opt.ConnectionString = @ "server=localhost;Database=CachingTest;Trusted_Connection=True;";  
        opt.SchemaName = "dbo";  
        opt.TableName = "SQLCache";  
    });  
}  

SQL Server önbellek verilerini binary formatta tutacağından önbelleğe kayıt aktarırken buna dikkat etmeliyiz. Aynı zamanda önbellekten kayıt çekerken kendi ilgili nesnemize dönüşümünü sağlamalıyız. Aşağıdaki örnekte SetCache, GetCache ve RemoveCache olmak üzere 3 metot aracılığı ile önbellekleme işlemlerini inceleyebiliriz.

using System;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
public class HomeController : Controller
{
    IDistributedCache _memoryCache;
    public HomeController(IDistributedCache memoryCache)
    {
        _memoryCache = memoryCache;
    }

    public IActionResult SetCache()
    {
        var value = "Önbellek için veri...";
        _memoryCache.Set("Example", Encoding.UTF8.GetBytes(value),
            new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = DateTime.Now.AddYears(1)
            });
        return View();
    }

    public IActionResult GetCache()
    {
        string value;
        value = _memoryCache.Get("Example").ToString();
        ViewBag.data = value;
        return View();
    }

    public bool RemoveCache()
    {
        _memoryCache.Remove("Example");
        return true;
    }
}

Bu noktada verilerimiz artık SQL Server tarafında önbelleklenmiş olacak ve SQLCache tablosunda Example isminde bir kayıt oluştuğunu gözlemleyebilirsiniz.

 

Redis ile Distributed Cache
Redis önbellek olarak kullanılan açık kaynak bir veri deposudur. Redis kurulumu için öncelikle PowerShell kullanarak aşağıdaki komutu kullanabilirsiniz.

PS C:\>iex ((new-object net.webclient).DownloadString(‘https://chocolatey.org/install.ps1’))

Sonrasında Command Prompt aracılığıyla aşağıdaki kod ile Redis’i bilgisayarınıza kurabilirsiniz.

PS C:\>choco install redis-64

Ve Redis Server yüklendikten sonra, aşağıdaki Redis Server’a başlayabildiğimiz komutu kullanırız.

PS C:\>redis-server

Redis Server’ın düzgün çalışmaya başlayıp başlamadığını kontrol etmek için Redis istemcisini kullanarak bu sunucuya ping işlemi yapabiliriz.
Sunucu doğru çalışıyorsa, yanıt olarak “PONG” döndürür.

Artık Redis dağıtık önbellekleme için hazır ve projemizde project.json dosyasına Microsoft.Extensions.Caching.Redis.Core paketini tanımlamamız gerekiyor. Sonrasında Startup sınıfı içindeki ConfigureServices metodunda Redis yapılandırmasına ihtiyacımız olacak ve aşağıdaki kodu kullanarak yapılandırabiliriz. Configuration özelliği için yerel makine kullanacağımdan dolayı localhost:6379 olarak belirtiyorum.

            services.AddDistributedRedisCache(options => {
                options.Configuration = "localhost:6379";
                options.InstanceName = "";
            });

Uygulamada Redis dağıtık önbellekleme testi yapmak için kodlar SQL ile aynıdır ve testimizi yaptıktan sonra Redis tarafındaki key listesine aşağıdaki gibi erişebilirsiniz.

 

Herkese mutlu kodlamalar 🙂

Tarih:ASP .NET Core

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.