परिचय: C# एप्लिकेशन में कैशिंग क्यों जरूरी है?
\n\nआधुनिक वेब डेवलपमेंट में, एप्लिकेशन की परफॉरमेंस सीधे यूजर अनुभव और बिजनेस मेट्रिक्स को प्रभावित करती है। पेज लोड होने में हर सेकंड की देरी आपको 7% कन्वर्ज़न खर्च करा सकती है। C# (.NET) में कैशिंग सिर्फ एक "अच्छा विकल्प" नहीं, बल्कि हर गंभीर डेवलपर के लिए अनिवार्य टूल है।
\n\nइस लेख में हम .NET इकोसिस्टम में कैशिंग के तीन मुख्य तरीकों को समझेंगे: Redis, Memcached और बिल्ट-इन समाधान (MemoryCache)। आप जानेंगे कि कब कौन सा टूल इस्तेमाल करना है, कैश को सही तरीके से कैसे कॉन्फ़िगर करें और सामान्य गलतियों से कैसे बचें। यह सामग्री शुरुआती C# डेवलपर्स और अनुभवी इंजीनियर्स दोनों के लिए उपयोगी होगी।
\n\n1. बिल्ट-इन कैशिंग: MemoryCache और IDistributedCache
\n\n.NET प्लेटफ़ॉर्म डेवलपर्स को कई बिल्ट-इन कैशिंग मैकेनिज़्म प्रदान करता है, जिनके लिए किसी थर्ड-पार्टी सर्विस की आवश्यकता नहीं होती।
\n\n1.1 MemoryCache — एक सर्वर के लिए लोकल कैश
\n\nIMemoryCache C# में डेटा कैश करने का सबसे सरल और तेज़ तरीका है। डेटा वर्तमान प्रोसेस की RAM में स्टोर होता है। यह सिंगल-थ्रेडेड या एक सर्वर पर चलने वाले एप्लिकेशन के लिए आदर्श है।
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 // महंगा ऑपरेशन (जैसे, DB क्वेरी)\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\nMemoryCache की मुख्य विशेषताएं:
\n- \n
- तेज़ गति — डेटा सीधे RAM से पढ़ा जाता है \n
- कोई सीरियलाइज़ेशन नहीं — ऑब्जेक्ट को ज्यों का त्यों स्टोर करता है \n
- सीमा — सर्वर फार्म में काम नहीं करता (हर सर्वर का अपना कैश) \n
- जोखिम — एप्लिकेशन रीस्टार्ट होने पर कैश पूरी तरह साफ़ हो जाता है \n
1.2 IDistributedCache — डिस्ट्रीब्यूटेड कैश के लिए एब्स्ट्रैक्शन
\n\nIDistributedCache इंटरफ़ेस किसी भी डिस्ट्रीब्यूटेड कैश के साथ काम करने के लिए एक यूनिफ़ाइड API प्रदान करता है। आप बिज़नेस लॉजिक कोड बदले बिना Redis, SQL Server या NCache के बीच स्विच कर सकते हैं।
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