हाइब्रिड कैश
हाइब्रिड कैश इन-मेमोरी और एक्सटर्नल सोर्स में डेटा कैश करने के लिए एक यूनिफाइड लाइब्रेरी है, जिसे मल्टी-टियर कैशिंग भी कहा जा सकता है। दूसरे शब्दों में, यह मल्टी-टियर कैशिंग IDistributedCache और IMemoryCache के लिए एक रिप्लेसमेंट है। यह .NET में कैशिंग के उपयोग को सरल बनाने और एक मजबूत कैशिंग समाधान बनाने के लिए भी अभिप्रेत है। डिस्ट्रिब्यूटेड कैशिंग के लिए पुराने दृष्टिकोण में यह सुनिश्चित करने के लिए अतिरिक्त कोड लिखना आवश्यक था कि चीजें ठीक से कैश्ड और पुनर्प्राप्त हों। यह पैकेज .NET में कैशिंग को सरल बनाने के लिए एक अद्भुत अतिरिक्त है ताकि एक मजबूत कैशिंग समाधान बनाया जा सके। हम Microsoft.Extensions.Caching.Hybrid NuGet पैकेज का उपयोग करके हाइब्रिड कैश को लागू करते हैं। इस लेख में, हम हाइब्रिड कैश पैकेज की सभी विशेषताओं को कवर करेंगे।
पैकेज विशेषताएं
- एक्सटेंसिबल कोड: इन-मेमोरी कैश के लिए लिखा गया कोड बिना संशोधन के Redis, SQL Server आदि जैसे एक्सटर्नल कैशिंग सर्वर के साथ इंटीग्रेशन के लिए यथावत उपयोग किया जा सकता है।
- कनकरेंसी मैनेजमेंट: हाइब्रिड कैश का उपयोग करने के लिए, हमें HybridCache क्लास को डिपेंडेंसी सर्विस के रूप में उपयोग करना होगा। यह क्लास सुनिश्चित करती है कि किसी भी कुंजी के लिए डेटा प्राप्त करने के लिए केवल एक इंस्टेंस उपयोग किया जाता है और उसी एंट्री के लिए कोई समवर्ती अनुरोध नहीं किए जाते हैं। सभी समवर्ती अनुरोध इस अनुरोध के पूरा होने की प्रतीक्षा करते हैं।
- मल्टी-सोर्स कैशिंग/प्राइमरी-सेकेंडरी सोर्स कैशिंग: यदि एप्लिकेशन ने कैशिंग के लिए डेटा के कई स्रोत कॉन्फ़िगर किए हैं, तो डेटा सभी स्थानों पर स्टोर होता है।
डेटा प्राप्त करने के लिए, यह पहले प्राइमरी सोर्स में चेक किया जाता है। यदि वह डेटा उपलब्ध नहीं है, तो अनुरोध सेकेंडरी सोर्स पर भेज दिया जाता है, जैसा कि नीचे डायग्राम में दिखाया गया है, परिदृश्य 1 नीले में और परिदृश्य 2 लाल में।
कोड सेटअप
शुरू करने के लिए, हम पहले Microsoft.Extensions.Caching.Hybrid पैकेज इंस्टॉल करेंगे।
Program.cs में, हम हाइब्रिड कैश जोड़ने के लिए नीचे कोड लिखेंगे।
builder.Services.AddHybridCache();
हाइब्रिड कैश को कॉन्फ़िगर करने के लिए, हम AddHybridCache के अंदर एक सेटअप एक्शन के रूप में नीचे कोड लिखते हैं। नीचे एक उदाहरण है।
builder.Services.AddHybridCache(options => {
options.ReportTagMetrics = true;
options.DefaultEntryOptions = new Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryOptions {
Expiration = TimeSpan.FromSeconds(30),
LocalCacheExpiration = TimeSpan.FromSeconds(30),
};
});
इन-मेमोरी कैश लागू करें
उपरोक्त डिपेंडेंसी सर्विस कॉन्फ़िगरेशन हमारे लिए एप्लिकेशन मेमोरी में की और वैल्यू सेट और गेट करने के लिए पर्याप्त है। नीचे API कंट्रोलर में नमूना कोड है।
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Hybrid;
namespace HybridCacheDemoApplication.Controllers {
[ApiController]
[Route("[controller]")]
public class CacheController : ControllerBase {
private readonly HybridCache _cache;
const string cacheKey = "ping";
public CacheController(HybridCache cache) {
_cache = cache;
}
[HttpGet(Name = "GetPingKey")]
public async Task<IActionResult> Get() {
var keydata = await _cache.GetOrCreateAsync<string>(
cacheKey,
async cancel => await Task.FromResult("pong from get")
);
return Ok(new {message = $"{cacheKey} data: {keydata}"});
}
[HttpGet("set",Name = "SetPingKey")]
public async Task<IActionResult> Set() {
await _cache.SetAsync<string>(cacheKey, "ping");
return Ok(new { message = $"{cacheKey} is set" });
}
}
}
यह समझने के लिए कि यह कोड कैसे काम करता है, नीचे दिए गए क्रम में टेबल देखें।
कैश निष्पादन डेमो टेबल
| क्रमांक | एंडपॉइंट | आउटपुट | व्याख्या |
|---|---|---|---|
| 1 | https://localhost:5154/cache/ | { "message": "ping data: pong from get" } |
यह एंडपॉइंट कैश वैल्यू को "pong from get" के रूप में सेट करता है जब वैल्यू सेट नहीं होती; इसलिए यह "pong from get" प्रिंट करेगा |
| 2 | https://localhost:5154/cache/set | { "message": "ping is set" } |
यह एंडपॉइंट कैश में वैल्यू सेट करेगा। |
| 3 | https://localhost:5154/cache/ | { "message": "ping data: ping" } |
यह वही एंडपॉइंट है जिसे हमने चरण 1 में इनवोक किया था, लेकिन इस बार, वैल्यू पहले से ही कैश में मौजूद है। |
कैश की हटाएं: कैश कीज़ हटाने के लिए, हम नीचे कार्यान्वयन का उपयोग करते हैं,
[HttpGet("del",Name="DeletePingKey")]
public async Task<IActionResult> RemoveKey() {
await _cache.RemoveAsync(cacheKey); // डेटा हटाता है
return Ok(new {message=$"{cacheKey} removed"});
}
Redis सर्वर का उपयोग करके डिस्ट्रिब्यूटेड कैशिंग
डिस्ट्रिब्यूटेड कैशिंग लागू करने के लिए, हमें अतिरिक्त डिपेंडेंसी सर्विस कॉन्फ़िगरेशन करने की आवश्यकता है। इस उदाहरण के लिए, हम एक्सटर्नल कैशिंग सोर्स के रूप में Redis कैश का उपयोग करेंगे।
अब, हम Microsoft.Extensions.Caching.StackExchangeRedis का उपयोग करके Redis पैकेज को कॉन्फ़िगर करेंगे।
एक बार इंस्टॉल हो जाने पर, हमें Redis जोड़ने के लिए नीचे कोड जोड़ना होगा। हमारा कनेक्शन स्ट्रिंग प्रारूप {HOST_NAME}:{PORT_NUMBER},password={PASSWORD} में होगा।
builder.Services.AddStackExchangeRedisCache(options => {
options.Configuration = builder.Configuration.GetConnectionString("RedisConnectionString");
});
अब, हम https://localhost:5154/cache/set इनवोक करेंगे, और डेटा Redis कैश में निर्बाध रूप से सेट हो जाएगा। नीचे दिखाया गया है कि यह Redis में कैसा दिखता है

ध्यान दें कि कैसे हमारा कोड केवल डिस्ट्रिब्यूटेड कैशिंग सर्वर, यानी हमारे परिदृश्य में Redis के लिए डिपेंडेंसी जोड़कर निर्बाध रूप से काम करता है।
सीरियलाइज़ेशन
एक्सटर्नल कैशिंग सर्वर को डेटा भेजने के लिए, यह पैकेज byte[], string, और System.Text.Json का उपयोग करता है। यह .AddSerializer() या AddSerializerFactory() मेथड्स का उपयोग करके AddHybridCache डिपेंडेंसी सर्विस के साथ अतिरिक्त रूप से अनुकूलन योग्य है। जब हम अधिक ऑप्टिमाइज़्ड सीरियलाइज़र का उपयोग करते हैं, तो वे एप्लिकेशन के प्रदर्शन में सुधार करते हैं।
अधिक अनुकूलन
हम डिपेंडेंसीज़ कॉन्फ़िगर करते समय फ्लैग्स सेट करके कैश सर्विसेज के व्यवहार को और अनुकूलित कर सकते हैं। नीचे कैशिंग के लिए कम्प्रेशन अक्षम करने के लिए एक नमूना फ्लैग है।
नोट. यह बेस्ट प्रैक्टिस नहीं है, लेकिन यह परिदृश्य के आधार पर भिन्न हो सकता है जब कम्प्रेशन की आवश्यकता नहीं होती या उपयोग नहीं किया जाता।
builder.Services.AddHybridCache(options => {
options.ReportTagMetrics = true;
options.DefaultEntryOptions = new Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryOptions {
Flags = Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryFlags.DisableCompression
};
});
प्रायोगिक फीचर: टैग्स - इंटर-रिलेटेड कुंजियों के साथ काम करना
कभी-कभी, हम कई और इंटररिलेटेड कुंजियों के साथ काम कर रहे होते हैं। उदाहरण: एक ई-कॉमर्स एप्लिकेशन में, हमारे पास बहुत सारे फील्ड्स कैश्ड होते हैं जो एक उपयोगकर्ता के लिए कार्ट आइटम से मेल खाते हैं। इसके लिए, हम टैग्स बना सकते हैं।
नीचे इंटर-रिलेटेड कुंजियों के साथ काम करने के लिए कोड है, हमने "testdata" नाम का टैग बनाया है, हम विभिन्न परिदृश्यों के लिए लागू ग्रुपिंग के प्रकार के आधार पर एक से अधिक टैग जोड़ सकते हैं। यह कोड स्व-व्याख्यात्मक है, लेकिन किसी भी भ्रम की स्थिति में, कमेंट्स में उल्लेख करें।
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Hybrid;
namespace HybridCacheDemoApplication.Controllers {
[ApiController]
[Route("[controller]")]
public class CacheController : ControllerBase {
private readonly HybridCache _cache;
const string cacheKey = "ping";
public CacheController(HybridCache cache) {
_cache = cache;
}
[HttpGet(Name = "GetPingKey")]
public async Task<IActionResult> Get() {
var keydata = await _cache.GetOrCreateAsync<string>(
cacheKey,
async cancel => await Task.FromResult("pong from get"),
tags: ["testdata"]
);
return Ok(new {message = $"{cacheKey} data: {keydata}"});
}
[HttpGet("set",Name = "SetPingKey")]
public async Task<IActionResult> Set() {
await _cache.SetAsync<string>(cacheKey, "ping", tags: ["testdata"] );
return Ok(new { message = $"{cacheKey} is set" });
}
[HttpGet("del",Name="DeletePingKey")]
public async Task<IActionResult> RemoveKey() {
await _cache.RemoveAsync(cacheKey);
return Ok(new {message=$"{cacheKey} removed"});
}
[HttpGet("delbytag", Name = "DeleteByTestTags")]
public async Task<IActionResult> RemoveKeyByTags() {
await _cache.RemoveByTagAsync(["testdata"]);
return Ok(new { message = $"{cacheKey} removed" });
}
}
}
अंत तक पढ़ने के लिए धन्यवाद। यह हाइब्रिड कैशिंग अद्भुत लाभ प्रदान करता है, और मुझे उम्मीद है कि आप भी इसे उपयोगी पाएंगे।