हाइब्रिड कैश
<पी> हाइब्रिड कैश इन-मेमोरी और बाहरी स्रोतों में डेटा को कैश करने के लिए एक एकीकृत लाइब्रेरी है, जिसे मल्टी-टियर कैशिंग भी कहा जा सकता है। दूसरे शब्दों में, यह बहु-स्तरीय कैशिंग IDistributedCache और IMemoryCache का प्रतिस्थापन है। इसका उद्देश्य .NET में कैशिंग के उपयोग को सरल बनाना भी है। वितरित कैशिंग के पुराने दृष्टिकोण में यह सुनिश्चित करने के लिए अतिरिक्त कोड लिखने की आवश्यकता होती है कि चीजें कैश्ड हैं और ठीक से पुनर्प्राप्त की गई हैं। यह पैकेज एक मजबूत कैशिंग समाधान बनाने के लिए .NET में कैशिंग को सरल बनाने के लिए एक अद्भुत अतिरिक्त है। हम हाइब्रिड कैश.एक्सटेंशन्स.कैचिंग.हाइब्रिड नगेट पैकेज लागू करने के लिए माइक्रोसॉफ्ट का उपयोग करते हैं। इस लेख में, हम हाइब्रिड कैश पैकेज की सभी विशेषताओं को कवर करेंगे। पैकेज सुविधाएँ
- एक्स्टेंसिबल कोड: इन-मेमोरी कैश के लिए लिखे गए कोड को रेडिस, एसक्यूएल सर्वर इत्यादि जैसे बाहरी कैशिंग सर्वर के साथ एकीकरण के लिए बिना किसी संशोधन के उपयोग किया जा सकता है।
- समवर्ती प्रबंधन: हाइब्रिड कैश का उपयोग करने के लिए, हमें निर्भरता सेवा के रूप में हाइब्रिड कैश क्लास का उपयोग करना होगा। यह वर्ग सुनिश्चित करता है कि किसी भी कुंजी के लिए डेटा प्राप्त करने के लिए केवल उदाहरण का उपयोग किया जाता है और समान प्रविष्टि के लिए कोई समवर्ती अनुरोध नहीं किया जाता है। सभी समवर्ती अनुरोध इस अनुरोध के पूरा होने की प्रतीक्षा करते हैं।
- मल्टी-सोर्स कैशिंग/प्राइमरी-सेकेंडरी सोर्स कैशिंग: यदि एप्लिकेशन ने कैशिंग के लिए डेटा के कई स्रोतों को कॉन्फ़िगर किया है, तो डेटा सभी स्थानों पर संग्रहीत किया जाता है।
<पी> डेटा प्राप्त करने के लिए सबसे पहले उसे प्राइमरी सोर्स में चेक किया जाता है। यदि वह डेटा उपलब्ध नहीं है, तो अनुरोध को द्वितीयक स्रोत पर भेज दिया जाता है, जैसा कि नीचे दिए गए चित्र में दिखाया गया है, परिदृश्य 1 नीले रंग में और परिदृश्य 2 लाल रंग में। <पी> पी> <पी> कोड सेटअप पी> <पी> आरंभ करने के लिए, हम पहले Microsoft.Extensions.Caching.Hybrid पैकेज इंस्टॉल करेंगे। <पी> प्रोग्राम.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),
};
});
इन-मेमोरी कैश लागू करें
<पी> उपरोक्त निर्भरता सेवा कॉन्फ़िगरेशन हमारे लिए इन-मेमोरी कैशिंग करने के लिए पर्याप्त है। एप्लिकेशन मेमोरी में कुंजी और मान सेट करने और प्राप्त करने के लिए एपीआई नियंत्रक में नमूना कोड नीचे दिया गया है।
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, // Unique key to the cache entry
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 http://localhost:5154/cache/
{
"message": "ping data: pong from get"
} जब मान सेट नहीं होता है तो यह समापन बिंदु कैश मान को "पोंग फ्रॉम गेट" के रूप में सेट करता है; इसलिए, यह "पोंग फ्रॉम गेट" 2 http://localhost:5154/cache/set
{
"message": "ping is set"
} प्रिंट करेगा यह समापन बिंदु कैश में मान सेट करेगा। 3 http://localhost:5154/cache/
{
"message": "ping data: ping"
} यह वही समापन बिंदु है जिसे हमने 1 चरण में लागू किया था, लेकिन इस बार, मान पहले से ही कैश में मौजूद है। <पी> कैश कुंजी हटाएं:कैश कुंजी हटाने के लिए, हम नीचे दिए गए कार्यान्वयन का उपयोग करते हैं,
[HttpGet("del",Name="DeletePingKey")]
public async Task<IActionResult> RemoveKey()
{
await _cache.RemoveAsync(cacheKey); //Removes data
return Ok(new {message=$"{cacheKey} removed"});
}
रेडिस सर्वर का उपयोग करके वितरित कैशिंग
<पी> वितरित कैशिंग को लागू करने के लिए, हमें अतिरिक्त निर्भरता सेवा कॉन्फ़िगरेशन करने की आवश्यकता है। इस उदाहरण के लिए, हम बाहरी कैशिंग स्रोत के रूप में रेडिस कैश का उपयोग करेंगे। <पी> अब, हम Microsoft.Extensions.Caching.StackExchangeRedis का उपयोग करके Redis पैकेज को कॉन्फ़िगर करेंगे। <पी> एक बार इंस्टॉल हो जाने पर, हमें Redis को जोड़ने के लिए नीचे दिया गया कोड जोड़ना होगा। हमारी कनेक्शन स्ट्रिंग प्रारूप में होगी {HOST_NAME}:{PORT_NUMBER},password={PASSWORD}
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration =
builder.Configuration.GetConnectionString("RedisConnectionString");
});
<पी> अब, हम http://localhost:5154/cache/set को इनवॉइस करेंगे, और डेटा को रेडिस कैश में निर्बाध रूप से सेट किया जाएगा। नीचे बताया गया है कि यह Redis में कैसा दिखता है <पी>
<पी> ध्यान दें कि हमारे परिदृश्य में वितरित कैशिंग सर्वर यानी रेडिस के लिए निर्भरता जोड़कर हमारा कोड कितनी सहजता से काम करता है। क्रमांकन
<पी> बाहरी कैशिंग सर्वर पर डेटा भेजने के लिए, यह पैकेज बाइट[], स्ट्रिंग और System.Text.Json का उपयोग करता है। इसे अतिरिक्त रूप से AddHybridCache निर्भरता सेवा के साथ .AddSerializer() या AddSerializerFactory() विधियों का उपयोग करके अनुकूलन योग्य बनाया गया है। जब हम अधिक अनुकूलित सीरियलाइज़र का उपयोग करते हैं, तो वे एप्लिकेशन के प्रदर्शन में सुधार करते हैं। अधिक अनुकूलन
<पी> निर्भरता को कॉन्फ़िगर करते समय फ़्लैग सेट करके हम कैश सेवाओं के व्यवहार को और अधिक अनुकूलित कर सकते हैं। कैशिंग के लिए संपीड़न को अक्षम करने के लिए नीचे एक नमूना ध्वज है। <पी> ध्यान दें. यह सर्वोत्तम अभ्यास नहीं है, लेकिन यह उस परिदृश्य के आधार पर भिन्न हो सकता है जब संपीड़न की आवश्यकता या उपयोग नहीं किया जाता है।
builder.Services.AddHybridCache(options =>
{
options.ReportTagMetrics = true;
options.DefaultEntryOptions = new Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryOptions
{
Flags = Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryFlags.DisableCompression
};
});
प्रयोगात्मक सुविधा:टैग - अंतर-संबंधित कुंजियों के साथ कार्य करना
<पी> कभी-कभी, हम कई परस्पर संबंधित कुंजियों से निपट सकते हैं। उदाहरण: एक ई-कॉमर्स एप्लिकेशन में, हमने बहुत सारे फ़ील्ड कैश किए हैं जो उपयोगकर्ता के कार्ट आइटम से संबंधित हैं। इसके लिए हम टैग बना सकते हैं। <पी> नीचे कोड है, अंतर-संबंधित कुंजियों के साथ काम करने के लिए हमने "टेस्टडेटा" नामक टैग बनाया है, हम विभिन्न परिदृश्यों के लिए लागू समूहीकरण के प्रकार के आधार पर एक से अधिक टैग जोड़ सकते हैं। यह कोड स्वयं-व्याख्यात्मक है, लेकिन किसी भी भ्रम की स्थिति में, टिप्पणियों में इसका उल्लेख करें।
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, // Unique key to the cache entry
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" });
}
}
}
<पी> अंत तक पढ़ने के लिए धन्यवाद. यह हाइब्रिड कैशिंग आश्चर्यजनक लाभ प्रदान करती है, और मुझे आशा है कि आपको भी यह उपयोगी लगेगा।