.NET 8 Web API'de Bellek Üzerinde Önbellekleme Uygulama

Paylaş :

Eğer nadiren değişen ve veritabanından alınması maliyetli olan bir veri kümeniz varsa, uygulamanızın performansını artırmak için kesinlikle bir önbellek mekanizması uygulamayı düşünmelisiniz. Bellek üzerinde önbellekleme, bu tür veri kümelerini geçici olarak sunucunun belleğinde saklamamıza olanak tanır. Bu makalede, .NET 8 WebAPI'de bellek üzerinde önbellekleme nasıl uygulanır, bunu size göstereceğim.

.NET 8 Web API'de Bellek Üzerinde Önbellekleme Uygulama

Başlamak için, Visual Studio kullanarak yeni bir web API projesi oluşturun. Bu makalede, bir araç API uç noktası oluşturacağım ve araçların bir listesini döndüren bir örnek yapacağım.

Yeni bir proje oluşturduktan sonra, projenin kök klasöründe "models" adında bir klasör oluşturun. İçine "Vehicle.cs" adında yeni bir dosya oluşturun ve aşağıdaki araç modelini ekleyin.

namespace CachingInmemory.Models
{
public class Vehicle
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
}
}

Sonrasında, araçları almak için yeni bir servis sınıfı oluşturun. Ancak servis sınıfını oluşturmadan önce, IVehicleService adında yeni bir arayüz oluşturun.

using CachingInmemory.Models;

namespace CachingInmemory.Services
{
public interface IVehicleService
{
public List<Vehicle> GetVehicles();
}
}

Sonrasında, bu arayüzü uygulamak için VehicleService adında yeni bir servis sınıfı oluşturun. Ardından, bellek önbelleği ile çalışabilmek için bu sınıfa IMemoryCache arayüzünü enjekte etmelisiniz. Bunun yanı sıra, bellekteki öğeleri tanımlamak için kullanılacak olan "cache key" adında bir değişken oluşturun.

using CachingInmemory.Models;
using Microsoft.Extensions.Caching.Memory;

namespace CachingInmemory.Services
{
public class VehicleService : IVehicleService
{
private readonly IMemoryCache _memoryCache;
public string cacheKey = "vehicles";

public VehicleService(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}

public List<Vehicle> GetVehicles()
{
throw new NotImplementedException();
}
}
}

Sonrasında, GetVehicle metodunu uygulamamız gerekiyor. Aşağıdaki kod parçacığında, uygulanan kodu görebilirsiniz.

using CachingInmemory.Models;
using Microsoft.Extensions.Caching.Memory;

namespace CachingInmemory.Services
{
public class VehicleService : IVehicleService
{
private readonly IMemoryCache _memoryCache;
public string cacheKey = "vehicles";

public VehicleService(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}

public List<Vehicle> GetVehicles()
{
List<Vehicle> vehicles;

if(!_memoryCache.TryGetValue(cacheKey, out vehicles))
{
vehicles = GetValuesFromDbAsync().Result;

_memoryCache.Set(cacheKey, vehicles,
new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromSeconds(5)));
}
return vehicles;
}

private Task<List<Vehicle>> GetValuesFromDbAsync ()
{

List<Vehicle> vehicles = new List<Vehicle>
{
new Vehicle { Id = 1, Name = "Car" },
new Vehicle { Id = 2, Name = "Truck" },
new Vehicle { Id = 3, Name = "Motorcycle" }
};

Task<List<Vehicle>> VehiclesTask = Task<List<Vehicle>>.Factory.StartNew(() =>
{
Thread.Sleep(5000);
return vehicles;
});

return VehiclesTask;

}
}
}

GetVehicles yöntemi, araçları önbellekten alır veya varsa, onları bir veritabanından alır ve bunları önbellekte 5 saniye boyunca saklar.

GetValuesFromDbAsync yöntemi, veritabanı erişimini taklit ederek bir görev oluşturur ve bu görevin içinde 5 saniye bekledikten sonra araç listesini döndürür (Çünkü bir veritabanı çağrısı tamamlanması biraz zaman alır).

Son olarak, servis sınıfı arayüzünü Program.cs dosyasında kaydetmelisiniz.

builder.Services.AddScoped<IVehicleService, VehicleService>();
builder.Services.AddMemoryCache();

IVehicleService arayüzünü kaydetmenin yanı sıra, bağımlılık enjeksiyonu için IMemoryCache arayüzünü kaydetmek için Program.cs dosyasına AddMemoryCache yöntemini eklemelisiniz.

Sonrasında, controllers klasörü içinde VehicleController adında bir denetleyici oluşturun ve aşağıdaki kodu ekleyin.

using CachingInmemory.Models;
using CachingInmemory.Services;
using Microsoft.AspNetCore.Mvc;

namespace CachingInmemory.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class VehicleController : ControllerBase
{
private readonly IVehicleService _vehicleService;
public VehicleController(IVehicleService vehicleService)
{
_vehicleService = vehicleService;
}

[HttpGet]
public ActionResult<List<Vehicle>> GetVehicles()
{
return _vehicleService.GetVehicles();
}
}
}

Gördüğünüz gibi, bu denetleyicinin bir get uç noktası bulunmaktadır ve bu uç nokta, araç servisi ile iletişim kurarak araç listesini yanıt olarak döndürmektedir. İşte uygulama bu kadar basit :)

Projeyi çalıştırdığınızda ve bunu Postman gibi bir API test aracı ile test ettiğinizde, uç noktaya ilk eriştiğinizde yanıtı almanın 5 saniye sürdüğünü göreceksiniz.


Ancak uç noktaya ikinci kez eriştiğinizde, yanıtın 2 milisaniye içinde alındığını göreceksiniz ve bu sefer GetValuesFromDbAsync yönteminden veri almak yerine, önbellekten alındığını göreceksiniz.



İşte bu kadar. Tamamladınız! Makaleyi okuduğunuz için teşekkür ederim. Eğer kaynak kodlara ihtiyacınız varsa, bizimle iletişime geçiniz.

Hesabınızı yönetmek için giriş yapın

veya