التخزين المؤقت في C#: Redis وMemcached والحلول المضمنة
التخزين المؤقت هو أحد الأدوات الرئيسية لتحسين الأداء في تطبيقات الويب الحديثة. في نظام C# (.NET) البيئي، يتوفر للمطور آليات مضمنة (IMemoryCache، IDistributedCache) بالإضافة إلى حلول خارجية قوية (Redis، Memcached). في هذه المقالة، سنستعرض خصائصها، ونقارن الأداء، ونقدم أمثلة عملية على الكود.
1. الحلول المضمنة في .NET: IMemoryCache و IDistributedCache
يوفر ASP.NET Core واجهتين رئيسيتين للعمل مع التخزين المؤقت: IMemoryCache (ذاكرة تخزين مؤقت محلية في ذاكرة عملية واحدة) و IDistributedCache (تجريد للتخزين المؤقت الموزع).
IMemoryCache
مثالي للتطبيقات المتجانسة أو الخدمات المصغرة التي لا تتطلب مزامنة بين النسخ. يتم تخزين البيانات في ذاكرة الوصول العشوائي للخادم.
// التسجيل في Program.csbuilder.Services.AddMemoryCache();
// الاستخدام في الخدمةpublic class DataService{ private readonly IMemoryCache _cache;
public DataService(IMemoryCache cache) { _cache = cache; }
public async Task<string> GetExpensiveDataAsync(int id) { string cacheKey = $"data_{id}"; if (_cache.TryGetValue(cacheKey, out string cachedData)) { return cachedData; }
// محاكاة عملية ثقيلة await Task.Delay(500); string data = $"Result for {id}";
var options = new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromMinutes(10)) .SetSlidingExpiration(TimeSpan.FromMinutes(2));
_cache.Set(cacheKey, data, options); return data; }}IDistributedCache
تجريد يسمح بتوصيل أنظمة خلفية مختلفة (Redis، SQL Server، NCache) دون تغيير كود التطبيق. يتم تسجيله عبر AddDistributedRedisCache أو AddDistributedSqlServerCache.
// مثال مع Redisbuilder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379"; options.InstanceName = "SampleInstance";});
// الاستخدامpublic class DistributedService{ private readonly IDistributedCache _cache;
public DistributedService(IDistributedCache cache) { _cache = cache; }
public async Task<string> GetDataAsync(string key) { var cached = await _cache.GetStringAsync(key); if (cached != null) return cached;
var data = $"Computed at {DateTime.Now}"; await _cache.SetStringAsync(key, data, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5) }); return data; }}2. Redis: تخزين مؤقت موزع قوي لـ C#
Redis هو مخزن بيانات في الذاكرة يدعم الهياكل المعقدة (القوائم، المجموعات، التجزئات). بالنسبة لـ .NET، يتم استخدام العميل StackExchange.Redis أو الغلاف عالي المستوى Microsoft.Extensions.Caching.StackExchangeRedis.
مزايا Redis في C#:
- السرعة: زمن استجابة أقل من الميلي ثانية (في المتوسط 0.5-1 مللي ثانية).
- Pub/Sub: يمكن إخطار الخدمات الأخرى بتغييرات التخزين المؤقت.
- الاستمرارية: يمكن حفظ البيانات على القرص (RDB/AOF).
- التجميع: توسع أفقي مباشر من الصندوق.
مثال على الاستخدام المتقدم مع تسلسل JSON:
using StackExchange.Redis;using System.Text.Json;
public class RedisCacheService{ private readonly IDatabase _db; private readonly ConnectionMultiplexer _redis;
public RedisCacheService(string connectionString) { _redis = ConnectionMultiplexer.Connect(connectionStri