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

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

कैश को अमान्य करने का क्रम महत्वपूर्ण है। कैश से आइटम हटाने से पहले डेटा स्रोत को अपडेट करें। यदि आपने पहले कैश से आइटम हटा दिया, तो संभावना है कि क्लाइंट डेटा स्टोर के अपडेट होने से पहले आइटम ला सकता है। इसके परिणामस्वरूप डेटा स्टोर और कैश के बीच डेटा असंगति होगी।
इस पैटर्न का उपयोग कब करें?
- यह पैटर्न हमें ऑन-डिमांड डेटा लोड करने में सक्षम बनाता है और इसका उपयोग तब किया जा सकता है जब संसाधन मांग अप्रत्याशित हो
- एक कैश जो रीड-थ्रू और राइट-थ्रू ऑपरेशन प्रदान नहीं करता है।
नोट
- रीड-थ्रू: यह एक कैश है जो डेटाबेस के साथ लाइन में बैठता है और कैश मिस के मामले में, यह डेटाबेस से डेटा लोड कर सकता है और कैश को पॉप्युलेट कर सकता है।
- राइट-थ्रू: कैश डेटाबेस के साथ लाइन में बैठता है और डेटा हमेशा मुख्य डेटाबेस में कैश के माध्यम से जाता है।
Azure संसाधन बनाएं
ऊपर दिखाए अनुसार, हमें डेटाबेस (Azure SQL Server) और कैश (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>"
# रिसोर्स ग्रुप बनाना
az group create --name $resourceGroup --location $location
# बेसिक SKU के साथ Redis Cache बनाना
az redis create --name $redisCacheName --resource-group $resourceGroup --location $location --sku Basic --vm-size c0
# SQL Server बनाना
az sql server create -l $location -g $resourceGroup -n $sqlServerName -u $adminName -p $adminPassword
# बेसिक SKU के साथ SQL डेटाबेस बनाना
az sql db create -g $resourceGroup -s $sqlServerName -n $sqlDBName --service-objective Basic
कार्यान्वयन
आइए ASP.NET Core Web API प्रोजेक्ट बनाकर और Redis Cache और Entity Framework Core के लिए आवश्यक NuGet पैकेज जोड़कर कार्यान्वयन शुरू करें।
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
सबसे पहले, आइए एक Country मॉडल क्लास बनाएं।
public class Country
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
}
अब, Startup क्लास के ConfigureServices मेथड में EF Core और Redis Cache की निर्भरताओं को पंजीकृत करें।
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<CountryContext>(optionsAction =>
optionsAction.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddStackExchangeRedisCache(setupAction =>
{
setupAction.Configuration = Configuration.GetConnectionString("RedisConnectionString");
});
}
अब appsettings.json फाइल को संशोधित करें ताकि Redis Cache और SQL Database के कनेक्शन स्ट्रिंग्स समायोजित हो सकें।
"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 मेथड एक key का उपयोग करके कैश से एक आइटम प्राप्त करने का प्रयास करता है। यदि मिलान मिलता है, तो इसे वापस कर दिया जाता है। अन्यथा, डेटा डेटाबेस से प्राप्त किया जाएगा और कैश में पॉप्युलेट किया जाएगा। कैश्ड आइटम को 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 का उपयोग करके इसके प्राथमिक कार्यान्वयन का वर्णन किया है। हैप्पी कैशिंग!
मुझे आशा है कि आपको लेख पसंद आया। यदि आपको लेख दिलचस्प लगे तो कृपया लाइक और शेयर करें।