ابزار Hybrid Cache در .NET 9: بهبود عملکرد و سادگی در مدیریت کش
در دنیای توسعه نرمافزار، کشینگ یکی از مهمترین تکنیکها برای بهبود عملکرد و کاهش بار روی سرور است. در .NET 9، مایکروسافت ویژگی جدیدی به نام Hybrid Cache معرفی کرده است که ترکیبی از کش حافظه داخلی (In-Memory Cache) و کش توزیعشده (Distributed Cache) است. این ویژگی نه تنها عملکرد را بهبود میبخشد، بلکه مدیریت کش را نیز سادهتر میکند. در این مقاله، به بررسی Hybrid Cache، فواید آن، و نحوه استفاده از آن در یک سناریوی واقعی میپردازیم.
ابزار Hybrid Cache چیست؟
ابزار Hybrid Cache یک کتابخانه جدید در .NET 9 است که دو لایه کش را با هم ترکیب میکند:
کش L1 (کش حافظه داخلی): برای دسترسی سریع به دادهها در حافظه محلی.
کش L2 (کش توزیعشده): برای ذخیره دادهها در یک کش توزیعشده مانند Redis یا SQL Server، که برای محیطهای توزیعشده و چند سروری مناسب است.
این ترکیب باعث میشود که دادهها ابتدا از کش حافظه داخلی خوانده شوند و در صورت عدم وجود، از کش توزیعشده بازیابی شوند. این رویکرد نه تنها تأخیر را کاهش میدهد، بلکه از بار اضافی روی کش توزیعشده نیز جلوگیری میکند.
فواید Hybrid Cache
1. بهبود عملکرد: با استفاده از کش حافظه داخلی، دسترسی به دادههای پرکاربرد بسیار سریعتر میشود.
2. سادگی در مدیریت: دیگر نیازی به انتخاب بین کش حافظه داخلی و توزیعشده نیست. Hybrid Cache به طور خودکار این کار را انجام میدهد.
3. حمایت از تگها: میتوانید دادهها را با تگها گروهبندی کنید و به راحتی آنها را حذف یا بهروزرسانی کنید.
4. محافظت در برابر Stampede: هنگامی که چندین درخواست همزمان برای دادهای که در کش وجود ندارد ارسال میشود، Hybrid Cache از اجرای چندین باره کد جلوگیری میکند و فقط یک درخواست را پردازش میکند.
5. پیکربندی انعطافپذیر: میتوانید زمان انقضا و سایر تنظیمات را برای هر دو لایه کش به صورت جداگانه تنظیم کنید.
نحوه استفاده از Hybrid Cache در .NET 9
نصب و پیکربندی
برای شروع، باید بسته NuGet مربوط به Hybrid Cache را نصب کنید:
dotnet add package Microsoft.Extensions.Caching.Hybrid
سپس، سرویس Hybrid Cache را در برنامه خود اضافه کنید:
var builder = WebApplication.CreateBuilder(args);
// افزودن سرویس Hybrid Cache
builder.Services.AddHybridCache(options =>
{
options.DefaultEntryOptions = new HybridCacheEntryOptions
{
Expiration = TimeSpan.FromMinutes(30), // زمان انقضا برای کش توزیعشده
LocalCacheExpiration = TimeSpan.FromMinutes(5) // زمان انقضا برای کش حافظه داخلی
};
});
// افزودن Redis به عنوان کش توزیعشده
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = builder.Configuration.GetConnectionString("RedisConnectionString");
});
مثال عملی: کش کردن اطلاعات محصولات
فرض کنید یک API دارید که اطلاعات محصولات را از یک پایگاه داده بازیابی میکند. با استفاده از Hybrid Cache، میتوانید این اطلاعات را کش کنید تا درخواستهای بعدی سریعتر پاسخ داده شوند.
public class ProductService
{
private readonly HybridCache _cache;
public ProductService(HybridCache cache)
{
_cache = cache;
}
public async Task GetProductAsync(int productId, CancellationToken cancellationToken = default)
{
var cacheKey = $"product-{productId}";
return await _cache.GetOrCreateAsync(
cacheKey,
async cancel =>
{
// شبیهسازی بازیابی اطلاعات از پایگاه داده
return await FetchProductFromDatabaseAsync(productId, cancel);
},
cancellationToken: cancellationToken
);
}
private async Task FetchProductFromDatabaseAsync(int productId, CancellationToken cancellationToken)
{
// شبیهسازی یک عملیات زمانبر
await Task.Delay(1000, cancellationToken);
return new Product { Id = productId, Name = "Sample Product", Price = 99.99 };
}
}
در دنیای توسعه نرمافزار، کشینگ یکی از مهمترین تکنیکها برای بهبود عملکرد و کاهش بار روی سرور است. در .NET 9، مایکروسافت ویژگی جدیدی به نام Hybrid Cache معرفی کرده است که ترکیبی از کش حافظه داخلی (In-Memory Cache) و کش توزیعشده (Distributed Cache) است. این ویژگی نه تنها عملکرد را بهبود میبخشد، بلکه مدیریت کش را نیز سادهتر میکند. در این مقاله، به بررسی Hybrid Cache، فواید آن، و نحوه استفاده از آن در یک سناریوی واقعی میپردازیم.
ابزار Hybrid Cache چیست؟
ابزار Hybrid Cache یک کتابخانه جدید در .NET 9 است که دو لایه کش را با هم ترکیب میکند:
کش L1 (کش حافظه داخلی): برای دسترسی سریع به دادهها در حافظه محلی.
کش L2 (کش توزیعشده): برای ذخیره دادهها در یک کش توزیعشده مانند Redis یا SQL Server، که برای محیطهای توزیعشده و چند سروری مناسب است.
این ترکیب باعث میشود که دادهها ابتدا از کش حافظه داخلی خوانده شوند و در صورت عدم وجود، از کش توزیعشده بازیابی شوند. این رویکرد نه تنها تأخیر را کاهش میدهد، بلکه از بار اضافی روی کش توزیعشده نیز جلوگیری میکند.
فواید Hybrid Cache
1. بهبود عملکرد: با استفاده از کش حافظه داخلی، دسترسی به دادههای پرکاربرد بسیار سریعتر میشود.
2. سادگی در مدیریت: دیگر نیازی به انتخاب بین کش حافظه داخلی و توزیعشده نیست. Hybrid Cache به طور خودکار این کار را انجام میدهد.
3. حمایت از تگها: میتوانید دادهها را با تگها گروهبندی کنید و به راحتی آنها را حذف یا بهروزرسانی کنید.
4. محافظت در برابر Stampede: هنگامی که چندین درخواست همزمان برای دادهای که در کش وجود ندارد ارسال میشود، Hybrid Cache از اجرای چندین باره کد جلوگیری میکند و فقط یک درخواست را پردازش میکند.
5. پیکربندی انعطافپذیر: میتوانید زمان انقضا و سایر تنظیمات را برای هر دو لایه کش به صورت جداگانه تنظیم کنید.
نحوه استفاده از Hybrid Cache در .NET 9
نصب و پیکربندی
برای شروع، باید بسته NuGet مربوط به Hybrid Cache را نصب کنید:
dotnet add package Microsoft.Extensions.Caching.Hybrid
سپس، سرویس Hybrid Cache را در برنامه خود اضافه کنید:
var builder = WebApplication.CreateBuilder(args);
// افزودن سرویس Hybrid Cache
builder.Services.AddHybridCache(options =>
{
options.DefaultEntryOptions = new HybridCacheEntryOptions
{
Expiration = TimeSpan.FromMinutes(30), // زمان انقضا برای کش توزیعشده
LocalCacheExpiration = TimeSpan.FromMinutes(5) // زمان انقضا برای کش حافظه داخلی
};
});
// افزودن Redis به عنوان کش توزیعشده
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = builder.Configuration.GetConnectionString("RedisConnectionString");
});
مثال عملی: کش کردن اطلاعات محصولات
فرض کنید یک API دارید که اطلاعات محصولات را از یک پایگاه داده بازیابی میکند. با استفاده از Hybrid Cache، میتوانید این اطلاعات را کش کنید تا درخواستهای بعدی سریعتر پاسخ داده شوند.
public class ProductService
{
private readonly HybridCache _cache;
public ProductService(HybridCache cache)
{
_cache = cache;
}
public async Task GetProductAsync(int productId, CancellationToken cancellationToken = default)
{
var cacheKey = $"product-{productId}";
return await _cache.GetOrCreateAsync(
cacheKey,
async cancel =>
{
// شبیهسازی بازیابی اطلاعات از پایگاه داده
return await FetchProductFromDatabaseAsync(productId, cancel);
},
cancellationToken: cancellationToken
);
}
private async Task FetchProductFromDatabaseAsync(int productId, CancellationToken cancellationToken)
{
// شبیهسازی یک عملیات زمانبر
await Task.Delay(1000, cancellationToken);
return new Product { Id = productId, Name = "Sample Product", Price = 99.99 };
}
}