হাইব্রিড ক্যাশে
হাইব্রিড ক্যাশে হল একটি ইউনিফাইড লাইব্রেরি যা মেমরিতে এবং বাহ্যিক উত্সগুলিতে ডেটা ক্যাশ করার জন্য, যাকে বহু-স্তরের ক্যাশিং হিসাবেও উল্লেখ করা যেতে পারে। অন্য কথায়, এই মাল্ট-টায়ার ক্যাশিং হল IDistributedCache এবং IMemoryCache-এর প্রতিস্থাপন। এটি .NET-এ ক্যাশিং এর ব্যবহারকে সহজ করার উদ্দেশ্যেও। ডিস্ট্রিবিউটেড ক্যাশিংয়ের জন্য পুরানো পদ্ধতিতে জিনিসগুলি ক্যাশে করা এবং সঠিকভাবে পুনরুদ্ধার করা হয়েছে তা নিশ্চিত করতে অতিরিক্ত কোড লেখার প্রয়োজন। এই প্যাকেজটি একটি শক্তিশালী ক্যাশিং সমাধান করতে .NET-এ ক্যাশিং সহজ করার জন্য একটি আশ্চর্যজনক সংযোজন। আমরা একটি হাইব্রিড ক্যাশে. এক্সটেনশন. ক্যাচিং. হাইব্রিড নুগেট প্যাকেজ বাস্তবায়ন করতে মাইক্রোসফ্ট ব্যবহার করি। এই নিবন্ধে, আমরা হাইব্রিড ক্যাশে প্যাকেজের সমস্ত বৈশিষ্ট্য কভার করব।
প্যাকেজ বৈশিষ্ট্য
- এক্সটেনসিবল কোড: ইন-মেমরি ক্যাশের জন্য লেখা কোড রেডিস, এসকিউএল সার্ভার ইত্যাদির মতো বাহ্যিক ক্যাশিং সার্ভারের সাথে একীকরণের জন্য পরিবর্তন ছাড়াই ব্যবহার করা যেতে পারে৷
- সঙ্গতি ব্যবস্থাপনা: হাইব্রিড ক্যাশে ব্যবহার করার জন্য, আমাদের একটি নির্ভরতা পরিষেবা হিসাবে হাইব্রিড ক্যাশে ক্লাস ব্যবহার করতে হবে। এই ক্লাসটি নিশ্চিত করে যে কোনও কীর জন্য ডেটা পেতে শুধুমাত্র উদাহরণ ব্যবহার করা হয় এবং একই এন্ট্রির জন্য কোন সমসাময়িক অনুরোধ করা হয় না। সমস্ত সমসাময়িক অনুরোধ এই অনুরোধটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে।
- মাল্টি-সোর্স ক্যাশিং/প্রাথমিক-সেকেন্ডারি সোর্স ক্যাশিং: যদি অ্যাপ্লিকেশনটি ক্যাশে করার জন্য ডেটার একাধিক উত্স কনফিগার করে থাকে, তবে সমস্ত অবস্থানে ডেটা সংরক্ষণ করা হয়৷
ডেটা পেতে, এটি প্রথমে প্রাথমিক উত্সে চেক করা হয়। যদি সেই ডেটা উপলব্ধ না হয়, অনুরোধটি একটি গৌণ উত্সে ফরোয়ার্ড করা হয়, যেমনটি নীচের চিত্রে দেখানো হয়েছে, দৃশ্য 1 নীল এবং দৃশ্যকল্প 2 লাল।
কোড সেটআপ
শুরু করার জন্য, আমরা প্রথমে 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, // 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"
} এই এন্ডপয়েন্ট ক্যাশে মান সেট করে যখন মান সেট করা হয় না তখন "pong from get" হিসাবে; সুতরাং, এটি "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"});
} রেডিস সার্ভার ব্যবহার করে বিতরণ করা ক্যাশিং
বিতরণকৃত ক্যাশিং বাস্তবায়ন করতে, আমাদের অতিরিক্ত নির্ভরতা পরিষেবা কনফিগারেশনগুলি সম্পাদন করতে হবে। এই উদাহরণের জন্য, আমরা একটি বহিরাগত ক্যাশিং উত্স হিসাবে Redis ক্যাশে ব্যবহার করব।
এখন, আমরা 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
-এ এটি দেখতে কেমন তা নীচে দেওয়া হল

আমাদের দৃশ্যপটে একটি ডিস্ট্রিবিউটেড ক্যাশিং সার্ভার, যেমন, 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" });
}
}
}
শেষ পর্যন্ত পড়ার জন্য ধন্যবাদ. এই হাইব্রিড ক্যাশিং আশ্চর্যজনক সুবিধা প্রদান করে, এবং আমি আশা করি আপনিও এটি সহায়ক হবেন।