التخزين المؤقت في C#: Redis وMemcached والحلول المدمجة من الألف إلى الياء

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

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

ابدأ الدورة

مقدمة: لماذا يعتبر التخزين المؤقت مكونًا حاسمًا في تطبيقات C#

\n\n

في تطوير الويب الحديث، يؤثر أداء التطبيق بشكل مباشر على تجربة المستخدم ومؤشرات الأعمال. كل ثانية تأخير في تحميل الصفحة قد تكلفك 7% من التحويلات. التخزين المؤقت في C# (.NET) ليس مجرد "خيار لطيف"، بل أداة إلزامية لأي مطور جاد.

\n\n

في هذه المقالة، سنناقش ثلاثة طرق رئيسية للتخزين المؤقت في نظام .NET البيئي: Redis وMemcached والحلول المدمجة (MemoryCache). ستتعرف على متى تستخدم أي أداة، وكيفية تكوين الكاش بشكل صحيح وتجنب الأخطاء الشائعة. ستكون المادة مفيدة لمطوري C# المبتدئين وكذلك للمهندسين ذوي الخبرة الذين يرغبون في تنظيم معرفتهم.

\n\n

1. التخزين المؤقت المدمج: MemoryCache وIDistributedCache

\n\n

توفر منصة .NET للمطورين عدة آليات مدمجة للتخزين المؤقت لا تتطلب تثبيت خدمات خارجية.

\n\n

1.1 MemoryCache — كاش محلي لخادم واحد

\n\n

IMemoryCache هي أبسط وأسرع طريقة لتخزين البيانات مؤقتًا في C#. يتم تخزين البيانات في الذاكرة العشوائية للعملية الحالية. مثالية للتطبيقات أحادية الخيط أو التطبيقات التي تعمل على خادم واحد.

\n\n
using Microsoft.Extensions.Caching.Memory;\n\npublic class ProductService\n{\n    private readonly IMemoryCache _cache;\n    \n    public ProductService(IMemoryCache cache)\n    {\n        _cache = cache;\n    }\n\n    public async Task<Product> GetProductAsync(int id)\n    {\n        string cacheKey = $"product_{id}";\n        \n        if (!_cache.TryGetValue(cacheKey, out Product product))\n        {\n            // عملية مكلفة (مثل استعلام قاعدة البيانات)\n            product = await GetProductFromDatabaseAsync(id);\n            \n            var cacheOptions = new MemoryCacheEntryOptions()\n                .SetAbsoluteExpiration(TimeSpan.FromMinutes(30))\n                .SetSlidingExpiration(TimeSpan.FromMinutes(5))\n                .SetSize(1);\n            \n            _cache.Set(cacheKey, product, cacheOptions);\n        }\n        \n        return product;\n    }\n}
\n\n

الميزات الرئيسية لـ MemoryCache:

\n
    \n
  • سرعة عالية — تُقرأ البيانات مباشرة من RAM
  • \n
  • لا حاجة للتسلسل — تخزين الكائنات كما هي
  • \n
  • قيد — لا يعمل في مزرعة خوادم (كل خادم له كاش خاص به)
  • \n
  • خطر — عند إعادة تشغيل التطبيق، يتم مسح الكاش بالكامل
  • \n
\n\n

1.2 IDistributedCache — تجريد للكاش الموزع

\n\n

توفر الواجهة IDistributedCache واجهة برمجة تطبيقات موحدة للعمل مع أي كاش موزع. يمكنك التبديل بين Redis أو SQL Server أو NCache دون تغيير كود منطق الأعمال.

\n\n
using Microsoft.Extensions.Caching.Distributed;\nusing System.Text.Json;\n\npublic class WeatherService\n{\n    private readonly IDistributedCache _cache;\n    \n    public WeatherService(IDistributedCache cache)\n    {\n        _cache = cache;\n    }\n\n    public async Task<WeatherForecast> GetForecastAsync(string city)\n    {\n        string cacheKey = $"weather_{city}";\n        string cachedData = await _cache.GetStringAsync(cacheKey);\n        \n        if (cachedData != null)\n        {\n            return JsonSerializer.Deserialize<WeatherForecast>(cachedData);\n        }\n        \n        var forecast = await FetchFromApiAsync(city);\n        var serialized = JsonSerializer.Serialize(forecast);\n        \n        await _cache.SetStringAsync(cacheKey, serialized, new DistributedCacheEntryOptions\n        {\n            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15)\n        });\n        \n        return forecast;\n    }\n}
\n\n

2. R

المدونات

توصيات الكتب