التخزين المؤقت في C# (.NET): Redis وMemoryCache وأدوات أخرى
في التطبيقات الحديثة عالية التحميل بلغة C# (.NET)، يُعد التخزين المؤقت أحد الآليات الرئيسية لتحسين الأداء وتقليل الحمل على قواعد البيانات. في هذه المقالة، سنستعرض بالتفصيل أدوات التخزين المؤقت الأساسية في نظام .NET البيئي: MemoryCache المدمج، والذاكرة المؤقتة الموزعة باستخدام Redis عبر مكتبة StackExchange.Redis، بالإضافة إلى واجهة IDistributedCache.
1. التخزين المؤقت المدمج: MemoryCache
MemoryCache (مساحة الأسماء Microsoft.Extensions.Caching.Memory) هو أبسط طريقة لتخزين البيانات مؤقتًا مباشرة في ذاكرة الوصول العشوائي للعملية. مثالي للتطبيقات أحادية العملية (مثل ASP.NET Core بدون توسيع).
مثال على الاستخدام الأساسي:
using Microsoft.Extensions.Caching.Memory;
// إنشاء ذاكرة تخزين مؤقتIMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
// الكتابة في الذاكرة المؤقتة مع وقت حياة 5 دقائقcache.Set("user:123", new User { Id = 123, Name = "إيفان" }, TimeSpan.FromMinutes(5));
// القراءة من الذاكرة المؤقتةif (cache.TryGetValue("user:123", out User user)){ Console.WriteLine($"المستخدم: {user.Name}");}else{ Console.WriteLine("الذاكرة المؤقتة فارغة، يتم التحميل من قاعدة البيانات...");}المزايا: سرعة قصوى، بدون تأخير شبكة، سهولة الإعداد.
العيوب: البيانات تعيش فقط في عملية واحدة، وتُفقد عند إعادة تشغيل التطبيق.
2. التخزين المؤقت الموزع: Redis + StackExchange.Redis
للأنظمة الموزعة (عدة خوادم، خدمات مصغرة) يلزم وجود ذاكرة تخزين مؤقت خارجية. Redis هو الخيار الأكثر شيوعًا. المكتبة الرئيسية للعمل مع Redis في .NET هي StackExchange.Redis (أكثر من 6 آلاف نجمة على GitHub).
التثبيت:
dotnet add package StackExchange.Redisمثال على العمل مع Redis:
using StackExchange.Redis;
// الاتصال بـ RedisConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");IDatabase db = redis.GetDatabase();
// كتابة سلسلة مع TTL (وقت الحياة)db.StringSet("session:token123", "user_data_here", TimeSpan.FromHours(1));
// القراءةstring data = db.StringGet("session:token123");if (!string.IsNullOrEmpty(data)){ Console.WriteLine($"البيانات من الذاكرة المؤقتة: {data}");}
// تخزين الكائنات المعقدة مؤقتًا (تسلسل إلى JSON)var product = new Product { Id = 1, Name = "لابتوب", Price = 75000 };string json = System.Text.Json.JsonSerializer.Serialize(product);db.StringSet("product:1", json, TimeSpan.FromMinutes(10));
// إلغاء التسلسل عند القراءةstring cachedJson = db.StringGet("product:1");var cachedProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(cachedJson);إمكانيات إضافية لـ Redis:
- التجزئات (Hashes) — لتخزين الكائنات ذات الحقول (مثل ملف تعريف المستخدم).
- القوائم والمجموعات — لقوائم الانتظار والتصنيفات.
- Pub/Sub — للإشعارات بإبطال الذاكرة المؤقتة.
- نصوص Lua — للعمليات الذرية.
3. واجهة IDistributedCache
توفر Microsoft واجهة IDistributedCache (حزمة Microsoft.Extensions.Caching.Abstractions)، والتي تتيح التبديل بين تطبيقات الذاكرة المؤقتة المختلفة دون تغيير كود التطبيق.
التطبيقات:
MemoryDistributedCache— للتطوير والاختبار (يخزن في الذاكرة).RedisCache(حزمةMicrosoft.Extensions.Caching.StackExchangeRedis) — للإنتاج.SqlServerCache