التخزين المؤقت في C#: Redis وMemcached والحلول المضمنة في .NET

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التخزين المؤقت في 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.StackExchangeRedis


2.2 مثال مع Redis وIDistributedCache

بالإضافة إلى التخزين المؤقت الأساسي، يسمح Redis بتنفيذ:

  • جلسات المستخدمين — تخزين بيانات الجلسة بين الطلبات.
  • الأقفال

المدونات

توصيات الكتب