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

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

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

ابدأ الدورة

لماذا التخزين المؤقت هو القوة الخارقة لكل مطور C#

\n

تخيل: تطبيقك يذهب في كل مرة إلى قاعدة البيانات لنفس قائمة المدن أو أسعار العملات. قاعدة البيانات هي مورد بطيء ومكلف. ماذا لو قلنا لك أنه يمكنك الرد على المستخدم خلال 1 مللي ثانية بدلاً من 100؟ نعم، هذا ليس سحرًا، بل تخزينًا مؤقتًا ذكيًا للبيانات في C#.

\n

التخزين المؤقت هو تقنية تخزين مؤقت للبيانات المطلوبة بشكل متكرر في مخزن سريع (عادةً في الذاكرة العشوائية). في هذه المقالة، سنشرح كيفية دمج التخزين المؤقت في تطبيقات .NET باستخدام الآليات المدمجة والحلول الخارجية. ستتعلم كيفية اختيار الاستراتيجية الصحيحة وتجنب فخ البيانات القديمة.

\n\n

أنواع التخزين المؤقت في C#: من MemoryCache إلى Redis

\n

في نظام .NET البيئي، توجد عدة طرق للتخزين المؤقت. يعتمد الاختيار على بنية تطبيقك: تطبيق متكامل أو خدمات مصغرة، خادم واحد أو مجموعة خوادم.

\n\n

1. MemoryCache المدمج (System.Runtime.Caching / Microsoft.Extensions.Caching.Memory)

\n

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

\n

مثال على التسجيل والاستخدام في ASP.NET Core:

\n
// في Program.cs\nbuilder.Services.AddMemoryCache();\n\n// في وحدة التحكم أو الخدمة\npublic class WeatherService\n{\n    private readonly IMemoryCache _cache;\n\n    public WeatherService(IMemoryCache cache)\n    {\n        _cache = cache;\n    }\n\n    public async Task<string> GetWeatherAsync(string city)\n    {\n        string cacheKey = $"weather_{city}";\n\n        // نحاول الحصول على البيانات من التخزين المؤقت\n        if (_cache.TryGetValue(cacheKey, out string cachedData))\n        {\n            return cachedData;\n        }\n\n        // إذا لم تكن البيانات موجودة - نقوم بتحميلها (مثلاً من API)\n        string weatherData = await FetchWeatherFromApi(city);\n\n        // نحفظ في التخزين المؤقت لمدة 10 دقائق\n        var cacheEntryOptions = new MemoryCacheEntryOptions()\n            .SetAbsoluteExpiration(TimeSpan.FromMinutes(10));\n\n        _cache.Set(cacheKey, weatherData, cacheEntryOptions);\n\n        return weatherData;\n    }\n}
\n

الطرق الرئيسية: TryGetValue، Set، Remove. لاحظ سياسات انتهاء الصلاحية: الوقت المطلق (ستنتهي البيانات بعد N دقيقة بالضبط) والوقت المنزلق (تبقى البيانات حية طالما يتم الوصول إليها، وN دقيقة بعد آخر طلب).

\n\n

2. التخزين المؤقت الموزع: Redis عبر IDistributedCache

\n

إذا كان لديك عدة نسخ من التطبيق (مجموعة خوادم ويب، خدمات مصغرة)، فإن MemoryCache غير مناسب - سيخزن كل خادم نسخته الخاصة. هنا يأتي دور Redis. يعمل كخادم منفصل مشترك بين جميع النسخ.

\n

ربط Redis في C#:

\n
// قم بتثبيت الحزمة: Microsoft.Extensions.Caching.StackExchangeRedis\nbuilder.Services.AddStackExchangeRedisCache(options =>\n{\n    options.Configuration = "localhost:6379";\n    options.InstanceName = "SampleInstance";\n});\n\n// الاستخدام عبر IDistributedCache\npublic class ProductService\n{\n    private readonly IDistributedCache _cache;\n\n    public ProductService(IDistributedCache cache)\n    {\n        _cache = cache;\n    }\n\n    public async Task<Product> GetProductAsync(int id)\n    {\n        string cacheKey = $"product_{id}";\n        var cachedProduct = await _cache.GetStringAsync(cacheKey);\n\n        if (cachedProduct != null)\n        {\n            return JsonSerializer.Deserialize<Product>(cachedProduct);\n        }\n\n        var product = await FetchProductFromDb(id);\n        var serialized = JsonSerializer.Serialize(product);\n\n        await _cache.SetStringAsync(cacheKey, serialized, new DistributedCacheEntryOptions\n        {\n            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30)\n        });\n\n                

المدونات

توصيات الكتب