کتابخانه جدید کشینگ 🆕
HybridCache در ASP.NET Core
کشینگ ⚡️ برای ساخت اپلیکیشنهای سریع و مقیاسپذیر ضروری است. ASP.NET Core به طور سنتی دو گزینه کشینگ ارائه میداد: کشینگ درون-حافظهای و کشینگ توزیعشده. هر کدام مزایا و معایب خود را داشتند. کشینگ درون-حافظهای با استفاده از IMemoryCache سریع است اما به یک سرور واحد محدود میشود. کشینگ توزیعشده با IDistributedCache با استفاده از یک backplane در چندین سرور کار میکند.
حالا NET 9. قابلیت HybridCache را معرفی میکند، یک کتابخانه جدید که بهترینهای هر دو رویکرد را ترکیب میکند. این قابلیت از مشکلات رایج کشینگ مانند cache stampede جلوگیری میکند. همچنین ویژگیهای مفیدی مانند نامعتبرسازی بر اساس تگ و نظارت بهتر بر عملکرد را اضافه میکند.
به شما نشان خواهم داد که چگونه از HybridCache در اپلیکیشنهای خود استفاده کنید.
HybridCache چیست؟ 🤔
گزینههای کشینگ سنتی در ASP.NET Core محدودیتهایی دارند. کشینگ درون-حافظهای سریع است اما به یک سرور محدود میشود. کشینگ توزیعشده در سرورهای مختلف کار میکند اما کندتر است.
HybridCache
هر دو رویکرد را ترکیب کرده و ویژگیهای مهمی را اضافه میکند:
1️⃣ کشینگ دو سطحی (L1/L2)
• L1: کش درون-حافظهای سریع
• L2: کش توزیعشده (Redis، SQL Server و غیره)
2️⃣ محافظت در برابر cache stampede
(زمانی که درخواستهای زیادی به یکباره به کش خالی برخورد میکنند)
3️⃣ نامعتبرسازی کش بر اساس تگ
4️⃣ سریالسازی قابل پیکربندی
5️⃣ معیارها و مانیتورینگ
کش L1 در حافظه اپلیکیشن شما اجرا میشود. کش L2 میتواند Redis، SQL Server یا هر کش توزیعشده دیگری باشد. اگر به کشینگ توزیعشده نیاز ندارید، میتوانید از HybridCache فقط با کش L1 استفاده کنید.
نصب HybridCache 📦
پکیج NuGet Microsoft.Extensions.Caching.Hybrid را نصب کنید:
Install-Package
Microsoft.Extensions.Caching.Hybrid
HybridCache را به سرویسهای خود اضافه کنید:
builder.Services.AddHybridCache(options =>
{
// حداکثر اندازه آیتمهای کش شده
options.MaximumPayloadBytes = 1024 * 1024 * 10; // 10MB
options.MaximumKeyLength = 512;
// تایماوتهای پیشفرض
options.DefaultEntryOptions = new HybridCacheEntryOptions
{
Expiration = TimeSpan.FromMinutes(30),
LocalCacheExpiration = TimeSpan.FromMinutes(30)
};
});
برای انواع داده سفارشی، میتوانید سریالایزر خود را اضافه کنید:
builder.Services.AddHybridCache()
.AddSerializer<CustomType, CustomSerializer>();
استفاده از HybridCache 👨💻
HybridCache
چندین متد برای کار با دادههای کش شده فراهم میکند. مهمترین آنها GetOrCreateAsync، SetAsync و متدهای مختلف remove هستند. بیایید ببینیم چگونه از هر کدام در سناریوهای دنیای واقعی استفاده کنیم.
گرفتن یا ایجاد ورودیهای کش 🔎
متد GetOrCreateAsync ابزار اصلی شما برای کار با دادههای کش شده است. این متد به طور خودکار هم cache hit و هم cache miss را مدیریت میکند. اگر داده در کش نباشد، متد factory شما را برای گرفتن داده فراخوانی کرده، آن را کش میکند و برمیگرداند.
در اینجا یک endpoint برای دریافت جزئیات محصول آمده است:
app.MapGet("/products/{id}", async (
int id,
HybridCache cache,
ProductDbContext db,
CancellationToken ct) =>
{
var product = await cache.GetOrCreateAsync(
$"product-{id}",
async token =>
{
return await db.Products
.Include(p => p.Category)
.FirstOrDefaultAsync(p => p.Id == id, token);
},
cancellationToken: ct
);
return product is null ? Results.NotFound() : Results.Ok(product);
});