التخزين المؤقت في C# (.NET): Redis وMemoryCache والبدائل
التخزين المؤقت هو أحد الأدوات الرئيسية لتحسين أداء التطبيقات في C# (.NET). فهو يسمح بتقليل وقت الاستجابة، وتخفيف الحمل على قواعد البيانات، وتقليل تكاليف البنية التحتية. في هذه المقالة، سنستعرض الآليات المدمجة في .NET، والتطبيقات الشائعة القائمة على Redis، بالإضافة إلى الحلول البديلة مثل NCache وCouchbase.
1. التخزين المؤقت المدمج: MemoryCache
MemoryCache (مساحة الأسماء Microsoft.Extensions.Caching.Memory) هو مخبأ بسيط وسريع يخزن البيانات في الذاكرة العشوائية لعملية واحدة. وهو مثالي للتطبيقات أحادية الخيط أو خوادم الويب ذات المثيل الواحد.
التثبيت والربط
dotnet add package Microsoft.Extensions.Caching.Memoryمثال على الاستخدام الأساسي
using Microsoft.Extensions.Caching.Memory;
public class DataService{ private readonly IMemoryCache _cache; private readonly TimeSpan _cacheDuration = TimeSpan.FromMinutes(5);
public DataService(IMemoryCache cache) => _cache = cache;
public async Task<string> GetDataAsync(string key) { if (!_cache.TryGetValue(key, out string cachedData)) { cachedData = await FetchFromDatabaseAsync(key); _cache.Set(key, cachedData, new MemoryCacheEntryOptions { AbsoluteExpirationRelativeToNow = _cacheDuration }); } return cachedData; }}المزايا والعيوب
- + البساطة، عدم وجود تأخير في الشبكة.
- + دعم مدمج لانتهاء الصلاحية (مطلق/منزلق).
- - لا يعمل عند التوسع عبر عدة خوادم.
- - عند إعادة تشغيل التطبيق، يتم مسح المخبأ.
2. التخزين المؤقت الموزع: Redis
Redis هو الخيار الأكثر شيوعًا للتخزين المؤقت الموزع في نظام .NET البيئي. يعمل كخدمة منفصلة متاحة لجميع مثيلات التطبيق. في .NET، يتم استخدام التجريد IDistributedCache.
تثبيت الحزمة
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedisالإعداد في Program.cs
builder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379"; options.InstanceName = "MyAppCache";});مثال على العمل مع IDistributedCache
public class RedisCacheService{ private readonly IDistributedCache _cache;
public RedisCacheService(IDistributedCache cache) => _cache = cache;
public async Task SetAsync(string key, byte[] data, int minutes = 10) { await _cache.SetAsync(key, data, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(minutes) }); }
public async Task<byte[]> GetAsync(string key) { return await _cache.GetAsync(key); }}الإمكانيات المتقدمة لـ Redis
- تسلسل الكائنات: استخدم
System.Text.JsonأوNewtonsoft.Json. - الإبطال بالعلامات: المكتبات الخارجية (مثل
EasyCaching.Redis) تسمح بتجميع السجلات. - Pub/Sub: للإشعارات بتغييرات المخبأ.
3. بدائل Redis
3.1 NCache
NCache هو حل تجاري (يوجد إصدار مجاني) مع دعم .NET. يوفر إمكانيات متقدمة: المزامنة بين العقد، استعلامات شبيهة بـ SQL للمخبأ، تخزين جلسات ASP.NET.
- + دعم مدمج لـ
IDist