কম্পিউটার টিউটোরিয়াল

.NET 9-এ হাইব্রিড ক্যাশ বিল্ড করা: Redis ব্যবহার করে ইউনিফাইড ইন-মেমরি এবং ডিস্ট্রিবিউটেড ক্যাশিং

হাইব্রিড ক্যাশ

হাইব্রিড ক্যাশ হলো একটি ইউনিফাইড লাইব্রেরি ডেটা ইন-মেমরি এবং এক্সটার্নাল সোর্সে ক্যাশ করার জন্য, যেটিকে মাল্টি-টিয়ার ক্যাশিংও বলা হয়। অন্য কথায়, এই মাল্টি-টিয়ার ক্যাশিং IDistributedCache এবং IMemoryCache-এর রিপ্লেসমেন্ট। এটি ক্যাশিং-এর ব্যবহার .NET-এ সিম্পলিফাই করার জন্যও ইণ্টেন্ডেড একটি রোবাস্ট ক্যাশিং সলিউশন বানাতে। পুরনো পদ্ধতিতে ডিস্ট্রিবিউটেড ক্যাশিংয়ের জন্য অ্যাডিশনাল কোড লিখতে হতো যাতে ক্যাশিং এবং রিট্রিভাল প্রপারলি হয়। এই প্যাকেজটি .NET-এ ক্যাশিং সিম্পলিফাই করার জন্য একটি Amazing অ্যাডিশন। আমরা Microsoft.Extensions.Caching.Hybrid nuget প্যাকেজ ব্যবহার করব হাইব্রিড ক্যাশ ইমপ্লিমেন্ট করতে। এই আর্টিকেলে, আমরা হাইব্রিড ক্যাশ প্যাকেজের সব ফিচার কভার করব।

প্যাকেজ ফিচারস

  • এক্সটেনসিবল কোড: ইন-মেমরি ক্যাশের জন্য লিখা কোড কোনো মডিফিকেশন ছাড়া ব্যবহার করা যাবে এক্সটার্নাল ক্যাশিং সার্ভারসহ ইন্টিগ্রেশনের জন্য যেন Redis, SQL Server, ইত্যাদি।
  • কনকারেন্সি ম্যানেজমেন্ট: হাইব্রিড ক্যাশ ব্যবহার করতে, হাইব্রিড ক্যাশ ক্লাসকে ডিপেন্ডেন্সি সার্ভিস হিসেবে ব্যবহার করতে হয়। এই ক্লাস নিশ্চিত করে যে শুধু একটা ইনস্ট্যান্স যেকোনো কীর জন্য ডেটা পেতে ব্যবহৃত হয় এবং একই এন্ট্রির জন্য কোনো কনকারেন্ট রিকোয়েস্ট করা হয় না। সকল কনকারেন্ট রিকোয়েস্ট এই রিকোয়েস্ট কমপ্লিট হওয়া পর্যন্ত অপেক্ষা করে।
  • মাল্টি-सোর্স ক্যাশিং/প্রাইমারি-সেকেন্ডারি সোর্স ক্যাশিং: যদি অ্যাপ্লিকেশনে ক্যাশিংয়ের জন্য একাধিক সোর্স কনফিগার্ড থাকে, ডেটা সব লোকেশনে স্টোর হয়।

ডেটা পেতে, প্রথমে প্রাইমারি সোর্সে চেক করা হয়। যদি ডেটা না থাকে, রিকোয়েস্ট সেকেন্ডারি সোর্সে ফরওয়ার্ড হয়, নিচের ডায়াগ্রামে দেখানো যেন সিনেরিও ১ ব্লুতে এবং সিনেরিও ২ রেডে।

কোড সেটআপ

শুরু করতে, আমরা প্রথমে 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" }); } } } 

এই কোড কীভাবে কাজ করে বুঝতে, নিচের টেবিল দেখুন ক্রমে।

ক্যাশ এক্সিকিউশন ডেমো টেবিল

SequenceEndpointOutputExplanation
1https://localhost:5154/cache/{ "message": "ping data: pong from get" }এই এন্ডপয়েন্ট ক্যাশ ভ্যালু সেট করে "pong from get" যখন ভ্যালু সেট নেই; তাই এটি "pong from get" প্রিন্ট করবে
2https://localhost:5154/cache/set{ "message": "ping is set" }এই এন্ডপয়েন্ট ক্যাশে ভ্যালু সেট করবে।
3https://localhost:5154/cache/{ "message": "ping data: ping" }এটি একই এন্ডপয়েন্ট যা ১ নম্বর স্টেপে ইনভোক করা হয়েছিল, কিন্তু এইবার ভ্যালু ইতিমধ্যে ক্যাশে এক্সিস্ট করে।

Delete Cache Key: ক্যাশ কী রিমুভ করতে, আমরা নিচের ইমপ্লিমেন্টেশন ব্যবহার করি,

[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-এ দেখাওয়া হয়

.NET 9-এ হাইব্রিড ক্যাশ বিল্ড করা: 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 }; });

এক্সপেরিমেন্টাল ফিচার: Tags - ইন্টার-রিলেটেড কীlerle কাজ

কখনও কখনও আমরা অনেক ও ইন্টাররিলেটেড কীসহ ডিল করি। উদাহরণ: একটি ই-কমার্স অ্যাপ্লিকেশনে, আমরা খুব সারি ফিল্ড ক্যাশ করেছি যা একটি কার্ট আইটেমকে একটি ইউজারের সাথে কোরিলেট করে। এর জন্য, আমরা ট্যাগ তৈরি করতে পারি।

নিচে কোড, ইন্টার-রিলেটেড কীlerle কাজ করার জন্য আমরা "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" }); } } } 

শেষ পর্যন্ত পড়ার জন্য ধন্যবাদ। এই হাইব্রিড ক্যাশিং অমেজিং বেনিফিট অফার করে, এবং আমি আশা করি আপনিও এটি হেল্পফুল পাবেন।


  1. Android-এ বুট টাইমে অ্যাপ্লিকেশন শুরু করার পদ্ধতি

  2. পাইথন প্রোগ্রাম: স্ট্রিং থেকে n-তম ক্যারেক্টার সরিয়ে ফেলা

  3. জাভাস্ক্রিপ্ট দিয়ে ব্রাউজার অনলাইন/অফলাইন ডিটেক্ট করা

  4. পাইথনে একটি সংখ্যার ফ্যাক্টোরিয়াল প্রোগ্রাম