التخزين المؤقت في C#: Redis وMemcached والحلول المضمنة لـ .NET
التخزين المؤقت هو أحد الأدوات الرئيسية لتحسين أداء التطبيقات في C#. فهو يسمح بتقليل وقت الاستجابة وتخفيف الحمل على قواعد البيانات وواجهات API الخارجية. في نظام .NET البيئي، تتوفر عدة طرق: من MemoryCache المضمن إلى الحلول الموزعة القائمة على Redis وMemcached. في هذه المقالة، سنستعرض كل خيار، ونقدم أمثلة على الكود، ونقدم توصيات للاختيار.
1. التخزين المؤقت المضمن: MemoryCache وIDistributedCache
توفر منصة .NET آليتين أساسيتين مجردتين للعمل مع التخزين المؤقت: IMemoryCache (داخل العملية) و IDistributedCache (موزع).
1.1 IMemoryCache
يخزن البيانات في ذاكرة العملية. مثالي للتطبيقات أحادية الخيط أو المتجانسة حيث لا تكون المزامنة بين خوادم متعددة مطلوبة. سهل الإعداد ولا يتطلب تبعيات خارجية.
// الإضافة في DI (Program.cs)builder.Services.AddMemoryCache();
// الاستخدام في الخدمةpublic class WeatherService{ private readonly IMemoryCache _cache;
public WeatherService(IMemoryCache cache) { _cache = cache; }
public async Task<string> GetWeatherAsync(string city) { string cacheKey = $"weather_{city}"; if (_cache.TryGetValue(cacheKey, out string cachedData)) { return cachedData; }
// محاكاة طلب طويل await Task.Delay(2000); string result = $"الطقس في {city}: +25°C";
var options = new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromMinutes(5)) .SetSlidingExpiration(TimeSpan.FromMinutes(2));
_cache.Set(cacheKey, result, options); return result; }}1.2 IDistributedCache
تجريد للتخزين المؤقت الموزع. يسمح بالتبديل بسهولة بين المزودين (Redis, SQL Server, NCache) دون تغيير منطق الأعمال. بشكل افتراضي، يخزن البيانات على شكل byte[].
// التسجيل (Program.cs) - نستخدم Redisbuilder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379";});
// الاستخدامpublic class ProductService{ private readonly IDistributedCache _cache;
public ProductService(IDistributedCache cache) { _cache = cache; }
public async Task<Product> GetProductAsync(int id) { string cacheKey = $"product_{id}"; var cachedBytes = await _cache.GetAsync(cacheKey);
if (cachedBytes != null) { return JsonSerializer.Deserialize<Product>(cachedBytes); }
// استعلام لقاعدة البيانات var product = await GetProductFromDb(id);
var options = new DistributedCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromHours(1));
var serialized = JsonSerializer.SerializeToUtf8Bytes(product); await _cache.SetAsync(cacheKey, serialized, options);
return product; }}2. Redis: تخزين مؤقت موزع بإمكانيات متقدمة
Redis هو الحل الأكثر شيوعًا للتخزين المؤقت في .NET. يعمل كمخزن عالي الأداء في الذاكرة مع دعم هياكل بيانات معقدة (قوائم، تجزئات، مجموعات).
2.1 التثبيت والإعداد
لتوصيل Redis بـ .NET، استخدم الحزمة Microsoft.Extensions.Caching.StackExchangeRedis.
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis2.2 مثال مع Redis وIDistributedCache
بالإضافة إلى التخزين المؤقت الأساسي، يسمح Redis بتنفيذ:
- جلسات المستخدمين — تخزين بيانات الجلسة بين الطلبات.
- الأقفال