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

একটি .NET 8 ওয়েব API-এ প্রাথমিক ডেটা স্টোর হিসাবে Redis

পরিচয়

এই নিবন্ধে, আমি রেডিস নিয়ে আলোচনা করতে যাচ্ছি এবং আমাদের ডেটা সঞ্চয় করার জন্য এটিকে প্রাথমিক ডেটাবেস হিসাবে ব্যবহার করার ক্ষেত্রে ব্যবহার করব৷

  • রেডিসের ভূমিকা
  • ডাটা টাইপগুলিকে রিডিস করুন
  • DB হিসাবে Redis ব্যবহার করার সুবিধা এবং অসুবিধা
  • একটি পাত্রে Redis সেট আপ করা হচ্ছে
  • .NET 8 ওয়েব API এর সাথে একটি প্রাথমিক ডাটাবেস হিসাবে Redis ব্যবহার করা।

পূর্বপ্রস্তুতি

  • ভিজ্যুয়াল কোড
  • .NET 8 SDK
  • রেডিস ডেস্কটপ ম্যানেজার। আপনি এটি URL(https://redis.io/resources/tools/)
  • থেকে ডাউনলোড করতে পারেন
  • ডকার ডেস্কটপ
  • প্যাকেজ
    • Microsoft.Extensions.Caching.stackExchangeRedis
    • StackExchange.Redis

Redis এর ভূমিকা

রেডিস একটি ইন-মেমরি ডেটাস্টোর এবং কী-মানের ডেটাস্টোর এবং এটি বেশিরভাগ ক্যাশিং স্তরের জন্য ব্যবহৃত হয়। যেহেতু রেডিস মেমরির মধ্যে ডেটা সঞ্চয় করে, এটি খুব দ্রুত পঠন এবং লেখার ক্রিয়াকলাপগুলির জন্য অনুমতি দেয় যা ডেটাতে কম লেটেন্সি অ্যাক্সেসের জন্য উপযুক্ত। আপনার কাছে প্রশ্ন থাকবে যেমন Redis মেমরিতে ডেটা সঞ্চয় করে কিন্তু সিস্টেম রিবুট হলে আমরা ডেটা হারাবো।

ডেটা স্থিরতার সমস্যা সমাধানের জন্য, রেডিস বিভিন্ন প্রক্রিয়া প্রদান করে যেমন স্ন্যাপশট এবং শুধুমাত্র যুক্ত ফাইল (AOF)। এই প্রক্রিয়াগুলি আপনাকে অবিরামভাবে ডিস্কে ডেটা সংরক্ষণ করার অনুমতি দেয়, এটি নিশ্চিত করে যে এটি একটি সিস্টেম রিবুট করার পরেও পুনরুদ্ধার করা যেতে পারে। আপনি URL এ Redis Persistence সম্পর্কে আরও জানতে পারেন

বেশিরভাগ রেডিস একটি ক্যাশে স্তর হিসাবে ব্যবহৃত হয় তবে জটিল ডাটাবেস সিস্টেমে অন্যান্য কল কমাতে আমরা এটিকে ডাটাবেস হিসাবেও ব্যবহার করতে পারি। ডকুমেন্ট ডাটাবেস মডেল ব্যবহার করে রেডিস যেখানে এটি বেশিরভাগ JSON ফর্ম্যাটে নথিতে ডেটা সঞ্চয় করে। এছাড়াও আপনি URL

থেকে আরও জানতে পারেন

ডাটা টাইপগুলিকে পুনরায় তৈরি করুন

Redis কিছু মুষ্টিমেয় ডেটা প্রকার সরবরাহ করে যা আমাদের ক্যাশিং, সারিবদ্ধ এবং ইভেন্ট প্রক্রিয়াকরণের সমস্যাগুলি সমাধান করতে দেয়৷

  • স্ট্রিংস: বাইটের একটি ক্রম প্রতিনিধিত্ব করে
  • তালিকা - স্ট্রিংগুলির তালিকা
  • সেট - অনন্য স্ট্রিং-এর ক্রমবিহীন সংগ্রহ
  • হ্যাশ - ক্ষেত্র-মূল্য জোড়ার সংগ্রহ হিসাবে মডেল করা রেকর্ড প্রকারগুলি

আপনি ইউআরএল

থেকে ডেটা প্রকার সম্পর্কে আরও জানতে পারবেন

DB হিসাবে Redis ব্যবহার করার প্রোগুলি

  • উচ্চ কর্মক্ষমতা
  • বহুমুখী ডেটা স্ট্রাকচার
  • লো লেটেন্সি
  • মাপযোগ্যতা

ডিবি হিসাবে রেডিস ব্যবহার করার কনফিউশন

  • ডেটা স্থায়িত্ব
  • সীমিত কোয়েরি ক্ষমতা
  • মেমরি সীমাবদ্ধতা

একটি পাত্রে Redis সেট আপ করা

নিশ্চিত করুন যে, ডকার ডেস্কটপ চলছে এবং ভিজ্যুয়াল স্টুডিও 2022 খুলুন।

"একটি নতুন প্রকল্প তৈরি করুন" চয়ন করুন --> "ASP.NET কোর ওয়েব API" ক্লিক করুন এবং তারপরে "পরবর্তী" ক্লিক করুন৷

কনফিগার পৃষ্ঠায়, প্রকল্পের নাম লিখুন এবং তারপরে "পরবর্তী" টিপুন।

একটি .NET 8 ওয়েব API-এ প্রাথমিক ডেটা স্টোর হিসাবে Redis

অতিরিক্ত তথ্য পৃষ্ঠায়, স্ক্রিনশট অনুযায়ী তথ্য নির্বাচন করুন এবং "তৈরি করুন" নির্বাচন করুন।

একটি .NET 8 ওয়েব API-এ প্রাথমিক ডেটা স্টোর হিসাবে Redis

এখন, আমাদের রেডিসের কনফিগারেশন ধরে রাখতে "docker-compose.yaml" ফাইল তৈরি করুন এবং নীচের কোডটি পেস্ট করুন৷

version: '3.8'
services:
 redis:
 image: redis:alpine
 container_name: redisStudentAPI
 ports:
 - 6379:6379

এর পরে, টুলস -> কমান্ড লাইন -> ডেভেলপার পাওয়ারশেল থেকে বিকাশকারী পাওয়ারশেল প্রম্পটটি খুলুন৷

তারপরে প্রজেক্ট ফোল্ডারের ভিতরে নেভিগেট করুন এবং YAML ফাইল "docker compose up -d" চালানোর জন্য কমান্ডটি প্রবেশ করান।

ডকার ডেস্কটপ খুলুন, এবং কনটেইনারগুলিতে নেভিগেট করুন আপনি YAML ফাইল থেকে তৈরি ধারকটি দেখতে পাবেন। এছাড়াও, আপনি চলমান পাত্রগুলি দেখতে 'ডকার পিএস' চালাতে পারেন।

একটি .NET 8 ওয়েব API-এ প্রাথমিক ডেটা স্টোর হিসাবে Redis

Redis সার্ভারের সাথে ইন্টারঅ্যাক্ট করতে, আপনাকে কন্টেইনার আইডি সহ নীচের কমান্ডটি চালাতে হবে।

docker exec -it <container_id> /bin/sh

ডকারের প্রাথমিক সেটআপ সম্পন্ন হয়েছে এবং আমরা কমান্ড লাইনের মাধ্যমে রেডিসের সাথে যোগাযোগ করতে সক্ষম হতে পারি।

এখন, আমরা স্ট্রিং ডেটা টাইপ সম্পর্কে আরও দেখতে যাচ্ছি কারণ আমরা কী সংরক্ষণ করতে যাচ্ছি, এবং স্ট্রিং হিসাবে জোড়া মান

স্ট্রিংস

এটি একটি কী এবং কী এবং মানের মধ্যে এক-টু-ওয়ান ম্যাপিংয়ের সাথে যুক্ত হওয়া সবচেয়ে সহজ ধরনের মান।

আমরা সেট ব্যবহার করে মান সেট করতে পারি এবং GET

ব্যবহার করেও পেতে পারি।

আপনি Del

ব্যবহার করে কী মুছে ফেলতে পারেন

এখন, আপনাকে NuGet প্যাকেজ ম্যানেজার থেকে প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করতে হবে৷

একটি .NET 8 ওয়েব API-এ প্রাথমিক ডেটা স্টোর হিসাবে Redis

Program.cs ফাইলগুলিতে কনফিগারেশন যোগ করুন

Programs.cs

builder.Services.AddSingleton<IConnectionMultiplexer>(options =>
 ConnectionMultiplexer.Connect(("127.0.0.1:6379")));
builder.Services.AddScoped<IStudentRepository, StudentRepository>();

একটি মডেল ফোল্ডার তৈরি করুন এবং আমাদের মডেল Student.cs এর জন্য একটি ফাইল তৈরি করুন তারপর কোড পেস্ট করুন৷

Student.cs

namespace StudentAPIWithRedisDB.Models
{
 public class Student
 {
 public string Id { get; set; } = $"student:{Guid.NewGuid().ToString()}";
 public required string StudentName { get; set; } = string.Empty;
 }
}

তারপর নিচের কোডটি অনুলিপি করুন এবং সম্মান ফাইলগুলিতে পেস্ট করুন।

StudentRepository.cs

using StudentAPIWithRedisDB.Models;
namespace StudentAPIWithRedisDB.Data
{
 public interface IStudentRepository
 {
 IEnumerable<Student> GetAllStudents();
 Student? GetStudentById(string id);
 void AddStudent(Student student);
 Student? UpdateStudent(Student student);
 Student? DeleteStudent(string id);
 }
}

StudentRepository.cs হল IStudentRespository.cs ইন্টারফেস এবং এর সমস্ত পদ্ধতির বাস্তবায়ন।

using StackExchange.Redis;
using StudentAPIWithRedisDB.Models;
using System.Text.Json;
namespace StudentAPIWithRedisDB.Data
{
 public class StudentRepository : IStudentRepository
 {
 private readonly IConnectionMultiplexer _redis;
 public StudentRepository(IConnectionMultiplexer redis) 
 {
 _redis = redis;
 }
 public void AddStudent(Student student)
 {
 if(student == null)
 {
 throw new ArgumentOutOfRangeException(nameof(student));
 }
 var db = _redis.GetDatabase();
 var serializedStudent = JsonSerializer.Serialize(student);
 db.StringSet(student.Id, serializedStudent);
 }
 public Student? DeleteStudent(string id)
 {
 var db = _redis.GetDatabase();
 var student = db.StringGet(id);
 if (student.IsNullOrEmpty)
 {
 return null;
 }
 db.KeyDelete(id);
 return JsonSerializer.Deserialize<Student>(student);
 }
 public IEnumerable<Student> GetAllStudents()
 {
 var db = _redis.GetDatabase();
 var studentKeys = db.Multiplexer.GetServer(_redis.GetEndPoints().First()).Keys(pattern: "student:*");
 var students = new List<Student>();
 foreach (var key in studentKeys)
 {
 var studentJson = db.StringGet(key);
 if (!studentJson.IsNullOrEmpty)
 {
 var student = JsonSerializer.Deserialize<Student>(studentJson);
 students.Add(student);
 }
 }
 return students;
 }
 public Student? GetStudentById(string id)
 {
 var db = _redis.GetDatabase();
 var student = db.StringGet(id);
 if(student.IsNullOrEmpty)
 {
 return null;
 }
 return JsonSerializer.Deserialize<Student>(student);
 }
 public Student UpdateStudent(Student student)
 {
 var db = _redis.GetDatabase();
 
 var id = student.Id;
 if (db.KeyExists(id))
 {
 var updatedStudentJson = JsonSerializer.Serialize(student);
 db.StringSet(id, updatedStudentJson);
 return student;
 }
 else
 {
 return null;
 }
 }
 }
}

StudentsController.cs

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using StudentAPIWithRedisDB.Data;
using StudentAPIWithRedisDB.Models;
namespace StudentAPIWithRedisDB.Controllers
{
 [Route("api/[controller]")]
 [ApiController]
 public class StudentsController : ControllerBase
 {
 private readonly IStudentRepository _studentRepository;
 public StudentsController(IStudentRepository studentRepository)
 {
 _studentRepository = studentRepository;
 }
 [HttpGet("{Id}", Name = "GetStudentById")]
 public ActionResult<Student> GetStudentById(string Id)
 {
 var student = _studentRepository.GetStudentById(Id);
 if(student == null)
 {
 return NotFound();
 } 
 return Ok(student);
 }
 [HttpPost]
 public ActionResult<Student> AddStudent(Student student)
 {
 _studentRepository.AddStudent(student);
 return CreatedAtRoute(nameof(GetStudentById), new { Id = student.Id }, student);
 }
 [HttpGet(Name = "GetAllStudents")]
 public ActionResult<Student> GetAllStudents()
 {
 var students = _studentRepository.GetAllStudents();
 return Ok(students);
 }
 [HttpDelete("{id}")]
 public ActionResult<Student> DeleteStudent(string id)
 {
 var student = _studentRepository.DeleteStudent(id);
 if(student == null)
 {
 return NotFound();
 }
 return Ok(student);
 }
 [HttpPatch]
 public ActionResult<Student> UpdateStudent(Student student)
 {
 var studentToUpdate = _studentRepository.GetStudentById(student.Id);
 if(studentToUpdate == null)
 {
 return NotFound();
 }
 _studentRepository.UpdateStudent(student);
 return NoContent();
 }
 }
}

এখন, সোয়াগার ব্যবহার করে ব্রাউজারে দেখানো শেষ পয়েন্টগুলি দেখতে পারবেন এমন অ্যাপ্লিকেশনটি চালান৷

একটি .NET 8 ওয়েব API-এ প্রাথমিক ডেটা স্টোর হিসাবে Redis

এছাড়াও, আপনি ডেটা দেখতে Redis ডেস্কটপ ম্যানেজার খুললে এটি সাহায্য করবে। প্রাথমিকভাবে, এতে কোনো ডেটা ছাড়াই ১৬টি ডাটাবেস থাকবে।

একবার, আপনি তৈরি এন্ডপয়েন্টে আঘাত করলে এটি স্বয়ংক্রিয়ভাবে DB0 এ একটি রেকর্ড তৈরি করবে।

তৈরি করুন

সহজ পরীক্ষার উদ্দেশ্যে, আমি শেষ পয়েন্ট পরীক্ষা করার জন্য পোস্টম্যান ব্যবহার করেছি।

শুধুমাত্র নামটি পাস করুন, তারপর এটি স্বয়ংক্রিয়ভাবে ছাত্রের নাম এবং নতুন গাইডের সাথে প্রত্যয় সহ একটি আইডি তৈরি করবে

এবং ডকুমেন্টটি DB0 এ তৈরি করা হয়েছে।

GetStudentById

এর জন্য আপনাকে ডকুমেন্ট থেকে আইডি কপি করতে হবে। তারপর অনুরোধ URL-এ এটি পাস করুন৷

এবং এটি আইডির উপর ভিত্তি করে মান প্রদান করে।

GetAll Students

এটি ডেটাবেসে উপলব্ধ সমস্ত নথি ফেরত দেয়৷

আপডেট করুন

আপনাকে আইডি এবং আপডেট করা মান পাস করতে হবে। তাই, এটি আইডির উপর ভিত্তি করে আপডেট হবে।

একবার, আপনি ম্যানেজারকে রিফ্রেশ করেন তারপর আপনি আপডেট করা মান দেখতে পাবেন।

মুছুন

কোনো ব্যবহারকারীকে মুছে ফেলার জন্য, অনুগ্রহ করে আইডিটি পাস করুন, তারপরে এটি স্টুডেন্ট ডিবি থেকে ডকুমেন্টটি সরিয়ে দেবে।

এবং নথিটি ফাইল থেকে মুছে ফেলা হয়।

পূর্বে, ছাত্রদের টেবিলে আমার কাছে দুটি নথি ছিল কিন্তু এখন প্রথমটি মুছে ফেলা হয়েছে৷

এটি আমাদের অ্যাপ্লিকেশনে একটি ডাটাবেস হিসাবে রেডিসের ব্যবহার দেখানোর একটি সহজ উপায়। এখানে, আমরা ক্যাশে হ্রাস করেছি এবং সরাসরি রেডিসে ডেটা সংরক্ষণ করেছি এবং এটি পুনরুদ্ধার ও পরিবর্তন করেছি। একইভাবে, আপনিও আপনার আবেদনে একই আবেদন করতে পারেন।


  1. Oracle Forms APP_MULTI প্যাকেজ ব্যবহার করুন

  2. HTML ট্যাগ

  3. কিভাবে এডিট টেক্সট মান চেক করবেন অ্যানাগ্রাম নাকি অ্যান্ড্রয়েডে নেই?

  4. পাইথনে অ্যানাকোন্ডা পরিবেশে প্যাকেজ যোগ করুন