التخزين المؤقت في C# (.NET): Redis وMemoryCache وحلول أخرى

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

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

ابدأ الدورة

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

توصيات