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

ASP.NET Core और Azure Redis Cache के साथ कैश-असाइड पैटर्न लागू करना

परिचय

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

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

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

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

नीचे आरेखीय चित्रण है:

ASP.NET Core और Azure Redis Cache के साथ कैश-असाइड पैटर्न लागू करना

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

ASP.NET Core और Azure Redis Cache के साथ कैश-असाइड पैटर्न लागू करना

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

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

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

नोट

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

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 का उपयोग करके इसके प्राथमिक कार्यान्वयन का वर्णन किया है। हैप्पी कैशिंग!

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

  1. Ruby में मर्ज सॉर्ट मास्टर करें: एक चरण-दर-चरण मार्गदर्शिका Ruby में मर्ज सॉर्ट मास्टर करें: एक चरण-दर-चरण मार्गदर्शिका

    यह Ruby के साथ विभिन्न सॉर्टिंग एल्गोरिदम को लागू करने पर एक श्रृंखला का भाग 3 है। भाग 1 ने बबल सॉर्ट का पता लगाया, और भाग 2 ने सिलेक्शन सॉर्ट का पता लगाया। जैसा कि हमने इस श्रृंखला के पिछले पोस्ट्स में चर्चा की है, डेटा को कैसे सॉर्ट किया जाए यह समझना किसी भी सॉफ्टवेयर इंजीनियर के टूलकिट का अभ

  1. Matplotlib में एक ही एक्सिस पर मल्टीपल लीजेंड्स कैसे ड्रॉ करें? Matplotlib में एक ही एक्सिस पर मल्टीपल लीजेंड्स कैसे ड्रॉ करें?

    Matplotlib में एक ही एक्सिस पर मल्टीपल लीजेंड्स ड्रॉ करने के लिए निम्नलिखित चरणों का पालन करें: चरण फिगर का आकार सेट करें और सबप्लॉट्स के बीच पैडिंग एडजस्ट करें अलग-अलग लेबल, linewidth और linestyle के साथ दो लिस्ट्स का उपयोग करके लाइन्स प्लॉट करें। पहली लीजेंड को अपर-राइट लोकेशन पर रखें। फर्स्ट ली

  1. Matplotlib को सभी X कोऑर्डिनेट्स दिखाने के लिए कैसे मजबूर करें? Matplotlib को सभी X कोऑर्डिनेट्स दिखाने के लिए कैसे मजबूर करें?

    सभी X (या Y) कोऑर्डिनेट्स को टिक्स के रूप में दिखाने के लिए plt.xticks(x) और plt.yticks(y) का उपयोग करें। चरण फिगर साइज़ और ऑटोलेआउट सेट करें। NumPy से x और y डेटा बनाएं। plt.margins(x=0, y=0) से मार्जिन हटाएं। plt.plot(x, y) से प्लॉट करें। plt.xticks(x) और plt.yticks(y) से सभी कोऑर्डिनेट्स को टिक्