TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 548 subscribers
Post #157 103
کتابخانه جدید کشینگ 🆕
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);
});
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →