HybridCache Nedir?

.Net 9 ile gelen HybridCache, memory cache ve distributed cache çözümlerini bir araya getirerek her ikisinin avantajlarını birlikte sunar. Bu özelliği kullanabilmek için Microsoft.Extensions.Caching.Hybrid paketini projenize eklemelisiniz. .Net 9 kullanıyorsanız, en az 9.0.100-preview.4 Sdk sürümünü yüklemeniz gerekir. .Net 10 ile bu özellik artık stabil olarak desteklenmektedir.

HybridCache
HybridCache

Neden HybridCache?

.Net uygulamalarında genelde iki seçeneğimiz var:

  1. IMemoryCache : Uygulama sunucusunun belleğinde tutulan hızlı bir cache. Ancak birden fazla sunucuda çalışan uygulamalarda, yapısı gereği verilerde tutarsızlığa neden olur.
  2. IDistributedCache : Tüm sunucular aynı cache’i paylaşır ama erişim hızı memory cache kadar hızlı değildir. (Örn: Redis)

HybridCache, iki kullanımı da aynı anda destekleyerek bize kullanım kolaylığı ve ekstra performans sağlar. Örnek ile beraber HybridCache ‘in çalışma mantığını detaylı bir şekilde anlatacağım.

HybridCache Kullanımı

Statik olarak oluşturacağımız kullanıcı listesini cache ‘leyen bir örnek yapmak için hemen docker da bir Redis ayağa kaldıralım ve geliştirmelere başlayalım.

Bash
docker run -d --name redis-hybridcache -p 6379:6379 redis

Redis ‘i çalışır hale getirdiysek, yeni bir web projesi açalım ve Redis, HybridCache paketlerini yükleyelim:

Bash
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
dotnet add package Microsoft.Extensions.Caching.Hybrid

Daha sonra Program.cs mize şu satırları ekleyelim:

C#
builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost:6379";
});

builder.Services.AddHybridCache();

Burada basit konfigürasyonlarla Redis ve HybridCache implementasyonlarını yaptık. Hybrid Cache, Redis yapılandırmamızı otomatik olarak görecek ve birlikte sorunsuz çalışacaktır.

Test metodumuzu içerecek olan UserController adında yeni bir controller açıp içeriğini şu şekilde düzenleyelim.

C#
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Hybrid;

namespace HybridCacheTest.Controllers;

[Route("user")]
public class UserController : Controller
{
    private readonly HybridCache _hybridCache;

    public UserController(HybridCache hybridCache)
    {
        _hybridCache = hybridCache;
    }

    [Route("list")]
    public async Task<string> GetUsers()
    {
        string cacheKey = $"UserList";
        
        var cacheOptions = new HybridCacheEntryOptions
        {
            Expiration = TimeSpan.FromMinutes(10)
        };

        var userList = await _hybridCache.GetOrCreateAsync(cacheKey, async data => await GetUserList(), cacheOptions);

        if (userList != null)
            return "Kullanıcı listesi alındı.";
        else
            return "Kullanıcı listesi boş.";
    }

    /// <summary>
    /// Normalde servis katmanı aracılığı ile alınması gerekir ama örnek için controller içinden kullanıcı listesi oluşturup onu dönüyoruz.
    /// </summary>
    /// <returns></returns>
    private async Task<List<UserDto>> GetUserList()
    {
        return new List<UserDto>()
        {
            new UserDto() { Id = 1, Name = "Test 1"},
            new UserDto() { Id = 1, Name = "Test 2"}
        };
    }
}

Browser’dan /user/list adresine gidildiğinde, GetUsers() metodumuz çalışacak ve kullanıcı listesini cache ‘e alacaktır. Örneğimizi tamamladık, şimdi çalıştıralım.

_hybridCache.GetOrCreateAsync satırı şu işlemleri yapar;

  1. Öncelikle “UserList” key ‘i memory cache’te var mı diye kontrol eder.
  2. Memory cache’te yoksa distributed cache’e (Redis) bakar.
  3. Data burada da yoksa ilgili metod çağrılır ve sonuç hem Redis’e hem de memory cache’e eklenir.

Böylece HybridCache ikinci istekte datayı Memory Cache ‘ten alıp, Client ‘a ileteceği için çok daha hızlı response dönecektir. Burada cache key lerimize vereceğimiz Expiration sürelerine dikkat etmeliyiz. Aksi durumda uygulamamızın çalıştığı sunucu belleğine fazla yük bindirmiş oluruz.

Ek açıklamalardan sonra Redis ‘i kontrol ettiğimizde, “UserList” key ‘ine ait data aşağıdaki gibi görünecektir :

Cache Remove işleminde ise ilgili data hem memory cache hem de distributed cache den silinir ve böylece tutarlılık sağlanmış olur.

Kritik Bilgi : Ani olarak birden fazla istek geldiğinde bile veri kaynağına 1 kez gidilir ve cache üretilir. Diğer client lar datayı cache üzerinden alırlar.

Bu makalede elimden geldiğince HybridCache ‘i anlatmaya çalıştım, umarım faydalı olmuştur.

Sonraki makalede görüşmek üzere 🙂

Faydalandığım linkler:

https://devblogs.microsoft.com/dotnet/hybrid-cache-is-now-ga/

https://medium.com/c-sharp-programming/exploring-hybridcache-in-net-9-a-game-changer-for-asp-net-core-applications-5afc321c0690

1
Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

Bir yanıt yazın

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