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

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

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

ابدأ الدورة

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

المدونات

توصيات الكتب