परिचय: उन्नत कैशिंग सब कुछ क्यों बदल देता है
\nआधुनिक उच्च-लोड आर्किटेक्चर में, प्रतिक्रिया गति और डेटाबेस पर लोड कम करना प्रमुख कार्य हैं। C# (.NET) में कैशिंग अब केवल परिणाम को याद रखना नहीं रह गया है: यह स्थिति, जीवनकाल और डेटा स्थिरता के प्रबंधन की एक जटिल प्रणाली है। उन्नत स्तर पर, डेवलपर को परिदृश्य के आधार पर Redis, Memcached और अंतर्निहित समाधानों के बीच चयन करना होता है।
\nइस लेख में, हम .NET इकोसिस्टम में कैशिंग के तीन मुख्य दृष्टिकोणों पर चर्चा करेंगे, उनके प्रदर्शन, कार्यान्वयन की जटिलता और सामान्य गलतियों की तुलना करेंगे। आप सीखेंगे कि Redis के साथ वितरित कैश कैसे सेट करें, उच्च लोड के लिए Memcached को कैसे अनुकूलित करें, और कब अंतर्निहित IMemoryCache सबसे अच्छा समाधान है।
.NET में अंतर्निहित कैशिंग: IMemoryCache और IDistributedCache
\nIMemoryCache — तेज़ स्थानीय कैश
\nनेमस्पेस Microsoft.Extensions.Caching.Memory से अंतर्निहित कैश IMemoryCache एकल एप्लिकेशन इंस्टेंस के लिए आदर्श समाधान है। यह प्रक्रिया की RAM में डेटा संग्रहीत करता है, न्यूनतम विलंबता सुनिश्चित करता है।
// Startup.cs या Program.cs में पंजीकरण\nbuilder.Services.AddMemoryCache();\n\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 if (!_cache.TryGetValue(cacheKey, out Product product))\n {\n product = await _repository.GetProductByIdAsync(id);\n var cacheEntryOptions = new MemoryCacheEntryOptions()\n .SetAbsoluteExpiration(TimeSpan.FromMinutes(5))\n .SetSlidingExpiration(TimeSpan.FromMinutes(1))\n .SetPriority(CacheItemPriority.High);\n\n _cache.Set(cacheKey, product, cacheEntryOptions);\n }\n return product;\n }\n}\n\nलाभ: शून्य नेटवर्क विलंबता, सरल सेटअप, स्लाइडिंग और एब्सोल्यूट एक्सपायरी का समर्थन।
\nनुकसान: कई सर्वरों पर स्केल करने पर काम नहीं करता; प्रक्रिया की RAM क्षमता द्वारा सीमित।
\n\nIDistributedCache — वितरित कैश के लिए एब्स्ट्रैक्शन
\nइंटरफ़ेस IDistributedCache आपको बिज़नेस लॉजिक को बदले बिना Redis, SQL Server या NCache के बीच आसानी से स्विच करने की अनुमति देता है। डिफ़ॉल्ट कार्यान्वयन MemoryDistributedCache (स्थानीय) है, लेकिन प्रोडक्शन के लिए आमतौर पर Redis चुना जाता है।
// Redis कार्यान्वयन का पंजीकरण\nbuilder.Services.AddStackExchangeRedisCache(options =>\n{\n options.Configuration = "localhost:6379";\n options.InstanceName = "SampleInstance";\n});\n\n// उपयोग\npublic async Task SetCacheAsync(string key, byte[] data)\n{\n var cache = context.RequestServices.GetRequiredService<IDistributedCache>();\n await cache.SetAsync(key, data, new DistributedCacheEntryOptions\n {\n AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)\n });\n}\n\nमुख्य लाभ एकीकरण है: आप एक बार कोड लिखते हैं, और कैश प्रदाता कॉन्फ़िगरेशन के माध्यम से बदलता है।
\n\nC# में Redis: उन्नत तकनीकें और पैटर्न
\nकनेक्शन और कनेक्शन पूल
\n.NET में Redis के साथ काम करने के लिए StackExchange.Redis लाइब्रेरी का उपयोग किया जाता है। हर बार नया कनेक्शन बनाने के बजाय, मल्टीप्लेक्सिंग का उपयोग करें — पूरे एप्लिकेशन के लिए एक कनेक्शन।
\n// ग्लोबल सिंगलटन\npublic static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379,abortConnect=false");\n\n// डेटाबेस प्राप्त करना\nIDatabase db = redis.GetDatabase(0);\n\n// बुनियादी संचालन\nawait db.StringSetAsync("user:1", "John Doe", TimeSpan.FromMinutes(30));\nstring name = await db.StringGetAsync("user:1");\n\n
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
ओपन सोर्स योगदान: TypeScript प्रोजेक्ट्स में योगदान कैसे शुरू करें
Rust में Enum मानों पर पुनरावृत्ति: प्रदर्शन के रहस्य
Java पर HTTP क्लाइंट: A से Z तक सही तरीके से अनुरोध करना
जावास्क्रिप्ट और प्रतिस्पर्धा: थ्रेड्स, गोरूटीन्स और async/await बिना सिरदर्द के
जावास्क्रिप्ट अनुप्रयोगों का प्रदर्शन अनुकूलन: सुझाव और उदाहरण