🚀 کشینگ در ASP.NET Core (قسمت ۲):
شیرجه عمیق در IMemoryCache
در قسمت اول با مبانی کشینگ آشنا شدیم. حالا وقتشه آستینها رو بالا بزنیم و به صورت عملی، اولین و سادهترین نوع کشینگ در ASP.NET Core یعنی کشینگ درون-حافظهای (In-Memory) رو با IMemoryCache پیادهسازی کنیم.
1️⃣ قدم اول: فعالسازی سرویس
مثل خیلی از قابلیتهای دیگه در ASP.NET Core، اول باید سرویس IMemoryCache رو در فایل Program.cs به اپلیکیشن خودمون اضافه کنیم تا بتونیم اون رو از طریق Dependency Injection (تزریق وابستگی) همه جا استفاده کنیم.
var builder = WebApplication.CreateBuilder(args);
// اضافه کردن سرویس کشینگ درون-حافظهای
builder.Services.AddMemoryCache();
// ... بقیه تنظیمات
2️⃣ قدم دوم: الگوی پیادهسازی (Try-Get-Set)
الگوی استاندارد برای کار با کش خیلی سادهست:
• امتحان کن (Try): سعی کن داده رو از کش بگیری.
• بگیر (Get): اگه تو کش بود، همونو برگردون.
• تنظیم کن (Set): اگه تو کش نبود، از منبع اصلی (مثل دیتابیس) بگیر و برای دفعههای بعدی، تو کش ذخیره کن.
این الگو رو در یک Minimal API ببینیم:
app.MapGet("products/{id}",
(int id, IMemoryCache cache, AppDbContext context) =>
{
// ۱. سعی میکنیم محصول رو از کش با کلید id بخونیم
if (!cache.TryGetValue(id, out Product product))
{
// ۲. اگه تو کش نبود (Cache Miss)، از دیتابیس میخونیم
product = context.Products.Find(id);
// ۳. داده رو در کش ذخیره میکنیم تا دفعه بعد استفاده بشه
// (گزینههای انقضا رو در بخش بعدی توضیح میدیم)
var cacheOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromMinutes(5));
cache.Set(id, product, cacheOptions);
}
// ۴. داده رو (چه از کش، چه از دیتابیس) برمیگردونیم
return Results.Ok(product);
});3️⃣ قدم سوم: مدیریت انقضای کش (Cache Expiration) ⏱️
دادهها نباید برای همیشه تو کش بمونن، چون ممکنه در دیتابیس تغییر کنن و کهنه (stale) بشن. ما باید به کش بگیم که چه زمانی این دادهها رو دور بریزه. دو تا سیاست اصلی برای این کار وجود داره:
✨️انقضای مطلق (Absolute Expiration):
یه تاریخ انقضای مشخص تعیین میکنه. مثلاً "۱۰ دقیقه دیگه، چه کسی از این داده استفاده کرد یا نکرد، حذفش کن."
.SetAbsoluteExpiration(TimeSpan.FromMinutes(10))
✨️انقضای لغزنده (Sliding Expiration):
یه بازه زمانی عدم فعالیت تعیین میکنه. مثلاً "اگه تا ۲ دقیقه کسی به این داده دست نزد، حذفش کن. ولی اگه کسی ازش استفاده کرد، عمرش رو ۲ دقیقه دیگه تمدید کن."
.SetSlidingExpiration(TimeSpan.FromMinutes(2))
🔖 هشتگها:
#ASPNETCore #Caching