Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

ASP.NET कोर और एज़्योर रेडिस कैश के साथ कैश-एसाइड पैटर्न को लागू करना

<पी> सॉफ़्टवेयर विकास चक्र में, अक्सर एप्लिकेशन के प्रदर्शन पर ध्यान केंद्रित किया जाता है। प्रदर्शन को बेहतर बनाने के कई तरीके हैं और आधुनिक क्लाउड अनुप्रयोगों में प्रदर्शन को बेहतर बनाने के लिए सबसे अधिक उपयोग किए जाने वाले पैटर्न में से एक कैश-साइड पैटर्न है। इस पोस्ट में, मैं कैश-असाइड पैटर्न और ASP.NET Core का उपयोग करके इसके कार्यान्वयन के बारे में संक्षेप में वर्णन करूंगा।

परिचय

<पी> यह पैटर्न काफी सीधा है और इसका एकमात्र उद्देश्य डेटा स्रोत से मांग पर डेटा को कैश में लोड करना है। यह कैश में डेटा और उसके अंतर्निहित डेटा स्रोत के बीच स्थिरता बनाए रखने में मदद करता है।

<पी> पैटर्न की विशेषताएं निम्नलिखित हैं।

  • जब किसी एप्लिकेशन को डेटा की आवश्यकता होती है, तो सबसे पहले वह कैश को देखेगा।
  • यदि डेटा कैश में मौजूद है, तो एप्लिकेशन कैश से डेटा का उपयोग करेगा।
  • अन्यथा, डेटा को डेटा स्रोत से पुनर्प्राप्त किया जाएगा।
<पी> नीचे आरेखीय चित्रण है

<पी> ASP.NET कोर और एज़्योर रेडिस कैश के साथ कैश-एसाइड पैटर्न को लागू करना

<पी> एप्लिकेशन द्वारा मान में परिवर्तन करने पर कैश ऑब्जेक्ट को अमान्य करना होगा।

<पी> ASP.NET कोर और एज़्योर रेडिस कैश के साथ कैश-एसाइड पैटर्न को लागू करना

<पी> कैश को अमान्य करने का क्रम महत्वपूर्ण है. कैश से आइटम हटाने से पहले डेटा स्रोत को अपडेट करें। यदि आपने पहले कैश से आइटम हटा दिया है, तो संभावना है कि क्लाइंट डेटा स्टोर अपडेट होने से पहले आइटम प्राप्त कर सकता है। इसके परिणामस्वरूप डेटा स्टोर और कैश के बीच डेटा असंगतता होगी।

इस पैटर्न का उपयोग कब करें?

  • यह पैटर्न हमें मांग पर डेटा लोड करने में सक्षम बनाता है और इसका उपयोग तब किया जा सकता है जब संसाधन की मांग अप्रत्याशित हो
  • एक कैश जो रीड-थ्रू और राइट-थ्रू ऑपरेशन प्रदान नहीं करता है।

नोट

  • पूरा पढ़ें: यह एक कैश है जो डेटाबेस के अनुरूप बैठता है और कैश मिस होने की स्थिति में, यह डेटाबेस से डेटा लोड कर सकता है और कैश को पॉप्युलेट कर सकता है।
  • इसके माध्यम से लिखें: कैश डेटाबेस के अनुरूप बैठता है और डेटा हमेशा कैश के माध्यम से मुख्य डेटाबेस तक जाता है।

Azure संसाधन बनाएं

<पी> जैसा कि ऊपर दिखाया गया है, हमें डेटाबेस (Azure SQL सर्वर) और कैश (Azure Redis Cache) की आवश्यकता है। आप अपनी सुविधानुसार डेटाबेस और कैशे चुन सकते हैं।

$resourceGroup="<Resource Group>"
$location="<location>"
$redisCacheName="<Redis cache name>"
$sqlServerName="<Azure SQL Server Name>"
$sqlDBName="<Azure SQL DB Name>"
$adminName="<admin name of SQL server>"
$adminPassword="<admin password of SQL Server>"
# Creating a resource group
az group create --name $resourceGroup --location $location
# Create Redis Cache with SKU as Basic
az redis create --name $redisCacheName --resource-group $resourceGroup --location $location --sku Basic --vm-size c0
# Create SQL Server
az sql server create -l $location -g $resourceGroup -n $sqlServerName -u $adminName -p $adminPassword
# Create SQL database with SKU as Basic
az sql db create -g $resourceGroup -s $sqlServerName -n $sqlDBName --service-objective Basic

कार्यान्वयन

<पी> आइए ASP.NET कोर वेब एपीआई प्रोजेक्ट बनाकर और रेडिस कैश और एंटिटी फ्रेमवर्क कोर के लिए आवश्यक Nuget पैकेज जोड़कर कार्यान्वयन शुरू करें।

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
<पी> सबसे पहले, आइए एक देश मॉडल वर्ग बनाएं।

public class Country 
{ 
 public int Id { get; set; } 
 public string Name { get; set; } 
 public bool IsActive { get; set; } 
} 
<पी> अब, आइए स्टार्टअप क्लास की कॉन्फिगरसर्विसेज विधि में ईएफ कोर और रेडिस कैश की निर्भरता को पंजीकृत करें।

public void ConfigureServices(IServiceCollection services)
{
 services.AddControllers();
 services.AddDbContext<CountryContext>(optionsAction =>
 optionsAction.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
 services.AddStackExchangeRedisCache(setupAction =>
 {
 setupAction.Configuration = Configuration.GetConnectionString("RedisConnectionString");
 });
}
<पी> अब Redis Cache और SQL डेटाबेस के कनेक्शन स्ट्रिंग को समायोजित करने के लिए appsettings.json फ़ाइल को संशोधित करें।

"ConnectionStrings": {
 "RedisConnectionString": "<Redis Cache ConnectionString>",
 "DefaultConnection": "<SQL Server Connection string>"
}
<पी> आइए DbContext क्लास जोड़ें।

public class CountryContext : DbContext
{
 public DbSet<Country> Countries { get; set; }
 public CountryContext(DbContextOptions dbContextOptions) : base(dbContextOptions)
 {
 }
}
<पी> GetCountries विधि एक कुंजी का उपयोग करके कैश से किसी आइटम को पुनर्प्राप्त करने का प्रयास करती है। यदि मिलान पाया जाता है, तो इसे वापस कर दिया जाता है। अन्यथा, डेटा डेटाबेस से पुनर्प्राप्त किया जाएगा और कैश में डाला जाएगा। कैश्ड आइटम को 5 मिनट के बाद समाप्त होने के लिए कॉन्फ़िगर किया गया है।

[Route("api/[controller]")]
[ApiController]
public class CountryController : ControllerBase
{
 private readonly IDistributedCache cache;
 private readonly CountryContext countryContext;
 public CountryController(IDistributedCache cache, CountryContext countryContext)
 {
 this.cache = cache;
 this.countryContext = countryContext;
 }
 // GET: api/<CountryController>
 [HttpGet]
 public async Task<IEnumerable<Country>> GetCountries()
 {
 var countriesCache = await cache.GetStringAsync("countries");
 var value = (countriesCache == null) ? default : JsonConvert.DeserializeObject<IEnumerable<Country>>(countriesCache);
 if (value == null)
 {
 var countries = countryContext.Countries.ToList();
 if (countries != null && countries.Any())
 {
 await cache.SetStringAsync("Countries", JsonConvert.SerializeObject(countries), new DistributedCacheEntryOptions
 {
 AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5)
 });
 return countries;
 }
 }
 return value;
 }
}
<पी> AddCountries विधि बताती है कि डेटाबेस में डेटा जोड़ने/अपडेट करने पर कैश को कैसे अमान्य किया जा सकता है।

// POST api/<CountryController>
[HttpPost]
public async Task<ActionResult<string>> AddCountries([FromBody] Country country, CancellationToken cancellationToken)
{
 if (country == null)
 return BadRequest("country is null");
 await countryContext.AddAsync(country);
 await countryContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
 await cache.RemoveAsync("countries", cancellationToken).ConfigureAwait(false);
 return Ok("cache has been invalidated");
}

निष्कर्ष

<पी> इस लेख में, मैंने ASP.NET Core और Azure Redis Cache का उपयोग करके कैश-असाइड पैटर्न और इसके प्राथमिक कार्यान्वयन का वर्णन किया है। हैप्पी कैशिंग!

<पी> मुझे आशा है कि आपको लेख पसंद आएगा. यदि आपको लेख रोचक लगे तो कृपया इसे लाइक और शेयर करें।


  1. डेटा संरचना में बाइनरी हीप डेटा संरचना में बाइनरी हीप

    हीप या बाइनरी हीप संतुलित बाइनरी ट्री डेटा संरचना का एक विशेष मामला है। यह पूर्ण बाइनरी ट्री संरचना है। तो एल-1 स्तर तक यह भरा हुआ है, और एल स्तर पर, सभी नोड्स बाएं से हैं। यहां रूट-नोड कुंजी की तुलना उसके बच्चों से की जाती है और उसके अनुसार व्यवस्थित किया जाता है। अगर a में चाइल्ड नोड b है तो - key

  1. मैं जावास्क्रिप्ट में उनके क्रम के आधार पर किसी टैग के आंतरिक HTML को कैसे बदलूं? मैं जावास्क्रिप्ट में उनके क्रम के आधार पर किसी टैग के आंतरिक HTML को कैसे बदलूं?

    इसके लिए, document.querySelectorAll() का उपयोग करें। उदाहरण निम्नलिखित कोड है - <!DOCTYPE html> <html lang="en"> <head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0

  1. सीएसएस टेबल, फ्लेक्सबॉक्स और ग्रिड के साथ दो साइड‑बाय‑साइड डिव्ज़ को समान ऊंचाई पर रखें सीएसएस टेबल, फ्लेक्सबॉक्स और ग्रिड के साथ दो साइड‑बाय‑साइड डिव्ज़ को समान ऊंचाई पर रखें

    हमें दो अगल-बगल div तत्वों को समान ऊंचाई पर रखने की आवश्यकता है ताकि जब किसी भी div में अधिक सामग्री जोड़ी जाए, तो दोनों div स्वचालित रूप से ऊंचाई में मेल खाते हैं। यह एक सुसंगत, पेशेवर लेआउट बनाता है जो असमान कॉलम उपस्थिति को रोकता है। समान ऊंचाई वाले स्तंभ प्राप्त करने के लिए कई दृष्टिकोण हैं। हम