আমার আগের ব্লগ পোস্টে, আমরা ক্যাশিং-এর সুবিধা, সাধারণ ক্যাশিং টেকনিক, এবং Upstash Redis ব্যবহার করে SQL ডেটা ক্যাশ করার বিভিন্ন কোড স্যাম্পল দেখেছিলাম।
SQL কোয়েরি ক্যাশ করার বিস্তারিত এবং সুবিধা পরীক্ষা করার পর, এখন আমরা আরও এগিয়ে যেতে পারি এবং কিছু একশন দেখতে পারি। এই উদ্দেশ্যে, আমরা একটি সাধারণভাবে ব্যবহৃত ORM, Prisma, দিয়ে শুরু করতে পারি ক্যাশিং Upstash Redis-এ কীভাবে কাজ করে ডেটাবেস কোয়েরির জন্য দেখতে।
এই ব্লগ পোস্টে, আমরা এক্সপ্লোর করব কীভাবে Upstash Redis কে Prisma-র সাথে ইন্টিগ্রেট করতে হয় কোয়েরি ক্যাশ করতে cache-aside টেকনিক দিয়ে, ডেটাবেস লোড কমানো, এবং অ্যাপ্লিকেশন পারফরম্যান্স বাড়াতে।
Prisma কী?
Prisma সেট আপ করার আগে, আসুন কিছু টার্ম এবং Prisma কী করে সেটা চেক করি।
প্রথমত, Prisma হলো একটি Object Relational Mapper (ORM) টুল যা অ্যাপ্লিকেশন এবং ডেটাবেসের মাঝপথে একটি ইন্টারফেস প্রদান করে।
ORM হলো একটি প্রোগ্রামিং টেকনিক যা ডেভেলপারদের راয় SQL কোয়েরি না লিখে হাই-লেভেল, অবজেক্ট-ওরিয়েন্টেড কোড ব্যবহার করে ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে দেয়। সহজ কথায়, এটি একটি ব্রিজ প্রদান করে যা রিলেশনাল ডেটাবেস এবং অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজকে সংযুক্ত করে।
একটি ORM ডেটাবেস টেবিলগুলোকে প্রোগ্রাম্যাটিক ল্যাঙ্গুয়েজ ক্লাস বা মডেলে ম্যাপ করে। একটি টেবিলের প্রতিটি রো একটি ক্লাসের ইনস্ট্যান্সের সাথে মিলে। এটি মূলত ডেটা মডেলিং যা আমরা অবজেক্ট-ওরিয়েন্টেড ল্যাঙ্গুয়েজে লিখা অ্যাপ্লিকেশনগুলোতে করি। ORM এটি আমাদের জন্য করে এবং মেথডগুলো প্রদান করে র SQL কোয়েরি লিখার বদলে। প্রোগ্রামার অবজেক্ট বা ক্লাসে মেথড কল করে CRUD অপারেশন পারফর্ম করতে পারে।
উদাহরণস্বরূপ, একটি users টেবিল কোয়েরি করা র SQL-এ এভাবেঃ
SELECT * FROM users WHERE id = 1;
ORM ব্যবহার করে, একই কোয়েরি এমন দেখাতে পারে:
const user = await user.findUnique({ where: { id: 1 } });
তবে, একটি ORM ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য প্রয়োজনীয় কাজগুলো করে এবং ডেটাকে এক্সিকিউটেড প্রোগ্রামে ব্যবহারযোগ্য বানায়, ডেভেলপারকে বড় সুবিধা দিয়ে।
Prisma সফটওয়্যার অ্যাপ্লিকেশনগুলোর মধ্যে সবচেয়ে সাধারণ এবং সহজে ব্যবহারযোগ্য ORM-lerden একটি।
Prisma কেন একটি ভালো ORM পছন্দ তার কিছু ইন্ডিকেটর এখানে:
টাইপ-সেফ কোয়েরি: Prisma আপনার ডেটাবেস স্কিমা অনুযায়ী একটি TypeScript ক্লায়েন্ট অটো-জেনারেট করে, যা ডেভেলপমেন্টের সময়েই এরর ধরতে দেয় রানটাইমে না।
সরল ডেটা মডেলিং:
schema.prismaফাইল দিয়ে, আপনি আপনার ডেটাবেস স্ট্রাকচার একটি ডিক্লেরেটিভ সিনট্যাক্স দিয়ে ডিফাইন করতে পারেন, যা Prisma প্রয়োজনীয় SQL বা API কল-এ ট্রান্সলেট করে। আমরা একটি উদাহরণ দেখব কীভাবে এই ফাইলে একটি মডেল লিখতে হয় টেবিল জেনারেট করতে Prisma দিয়ে।মাল্টি-ডেটাবেস সাপোর্ট: Prisma PostgreSQL, MySQL, SQLite, MongoDB, এবং আরও জনপ্রিয় ডেটাবেসের সাথে কাজ করে। Prisma ডকসে ডেটাবেসগুলো খুঁজে পাবেন।
মাইগ্রেশন ম্যানেজমেন্ট: Prisma একটি সহজে ব্যবহারযোগ্য মাইগ্রেশন সিস্টেম প্রদান করে আপনার ডেটাবেস স্কিমা কোডবেসের সাথে সিঙ্ক রাখতে।
Prisma CLI এবং Studio (একটি ওয়েব-ভিত্তিক ডেটাবেস GUI) ও প্রদান করে ডেটাবেস ম্যানেজমেন্ট আরও সহজ করতে।
Prisma সেটআপ
এখন, আসুন দেখি কীভাবে এটি ইনস্টল করা হয় এবং একটি অ্যাপ্লিকেশনে কীভাবে কাজ করে।
যেহেতু এই ব্লগ পোস্টের মূল ফোকাস Prisma কোয়েরি ক্যাশ করা, আমরা একটি খুব সহজ SQLite ডেটাবেস লোকালি ব্যবহার করতে পারি কিছু Prisma অপারেশন পারফর্ম করতে Prisma কাজ করে কিভাবে দেখানোর জন্য।
আমাদের প্রথমে sqlite3 ইনস্টল করতে হবে নিশ্চিত করতে যে আমাদের অ্যাপ SQLite ডেটাবেসের সাথে কানেক্ট এবং ইন্টারঅ্যাক্ট করতে পারে। যেমনটি আমি বলেছি, SQLite সেটআপ শুধু Prisma কীভাবে ডেটাবেসের সাথে কাজ করে তা демонস্ট্রেট করার জন্য। আপনার যদি অন্য কোনো পছন্দ থাকে, তবে আপনি আপনার ডেটাবেস টাইপের Prisma-সহ ইন্টিগ্রেশন Prisma ডকসে পাবেন।
টার্মিনালে প্রজেক্ট ডিরেক্টরিতে যান এবং SQLite ইনস্টল করুন এখানে।
npm install sqlite3
এখন আমাদের Prisma CLI ইনস্টল করতে হবে Prisma ORM ব্যবহার করতে পারতে।
npm install prisma --save-dev
তারপর Prisma ইনিশিয়ালাইজ করুন। এই ইনিশিয়ালাইজেশন একটি prisma ডিরেক্টরি তৈরি করবে একটি schema.prisma ফাইলসহ। schema.prisma ফাইলটি হলো যেখানে আপনি আপনার ডেটাবেস স্ট্রাকচার ডিফাইন করেন (মডেল, ফিল্ড, ইত্যাদি)।
npx prisma init
এখন, আমরা Prisma স্কিমা ডিফাইন করব। একটি এডিটরে prisma/schema.prisma ফাইল খুলুন।
এই ফাইলটি তিনটি ব্লকে গঠিত। প্রথম ব্লক হলো জেনারেটর যা Prisma কনফিগার করে আপনার Node.js অ্যাপ্লিকেশনে ব্যবহার করার জন্য ক্লায়েন্ট জেনারেট করার জন্য। দ্বিতীয় হলো ডেটাসোর্স ব্লক। এই ব্লকে, আমরা আমাদের ডেটাবেস সম্পর্কে প্রয়োজনীয় ইনফরমেশন দেব Prisma কানেক্ট করার জন্য। শেষ ব্লকে ডেটাবেস মডেলগুলো থাকে যা আমরা আমাদের ডেটাবেসের টেবিলগুলো এবং তাদের ফিল্ড ডিফাইন করতে পারি, ডেটা টাইপ এবং কনস্ট্রেইন্টসহ।
নিচে একটি উদাহরণ দেখুন।
generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model user { id Int @id @default(autoincrement()) name String email String @unique age Int? }
যেমন দেখছেন, আমরা ডেটাবেস URL দিয়েছি, এর টাইপ ইন্ডিকেট করে। খেয়াল রাখুন, আপনার প্রজেক্টে একটি DATABASE_URL এনভায়রনমেন্ট ভেরিয়েবল সেট করতে ভুলবেন না। অন্যান্য ডেটাবেস টাইপের সাথে কানেক্ট করার জন্য, আপনি Prisma ডকস চেক করতে পারেন। আমাদের স্যাম্পল কেসে, আমরা শুধু এটিকে file:./dev.db সেট করতে পারি।
এছাড়া, আমরা user টেবিল ডিফাইন করছি এর কলামগুলো তাদের টাইপ এবং কনস্ট্রেইন্টসহ ডিফাইন করে। আপনি আপনার প্রয়োজন অনুযায়ী ভিন্ন ডেটাবেস টাইপের সাথে আরও জটিল মডেল তৈরি করতে পারেন। কিন্তু এই ডেমোর জন্য, আমরা এই বেসিক সেটআপ দিয়ে যাব।
আমাদের স্কিমাকে ডেটাবেসের সাথে সিঙ্ক করতে প্রয়োজনীয় টেবিলগুলো তৈরি করার জন্য, আমাদের মাইগ্রেশন কমান্ড রান করতে হবে। --name ফ্ল্যাগটি এই মাইগ্রেশনের একটি নাম দেয়, যা স্কিমা চেঞ্জ ট্র্যাক করার জন্য সহজ করে দেয়।
npx prisma migrate dev --name init
আমাদের SQLite ডেটাবেস Prisma ORM-সহ এখন রেডি।
Upstash Redis সেটআপ
এটি সম্পূর্ণ করার দ্রুততম সেকশন। আমরা এই ধাপটি হাজার বার করেছি। যাই হোক, আমরা এখানেও দ্রুত ধাপগুলো পাস করব এই ব্লগ পোস্টকে শুরু থেকে একটি কমপ্লিট গাইড বানাতে। যারা এই ধাপগুলো पहले করে থাকেন, তারা শুধু তাদের প্রয়োজনীয় ধাপগুলোতে যেতে পারে।
আমরা Upstash কনসোলের মাধ্যমে একটি Redis ডেটাবেস তৈরি করব।
“Create database” বাটনে ক্লিক করে একটি Redis ডেটাবেস তৈরি করুন এবং পপ-আপ মোডালে আসা ধাপগুলো পূরণ করুন।
Upstash Redis ডেটাবেসের রিড রেপ্লিকাস সিলেক্ট করতে ভুলবেন না যখন ডেটাবেসের রিজন সিলেক্ট করছেন। গ্লোবাল Redis-এর সুবিধা সম্পর্কে আমার আগের ব্লগ পোস্টে জানতে পারেন।

Redis ডেটাবেস রেডি। আমাদের Upstash Redis সেটআপে একমাত্র বাকি রয়েছে অ্যাপ্লিকেশনে Redis ক্লায়েন্ট ইনিশিয়ালাইজ করা। এর জন্য, আমাদের প্রথমে Upstash Redis SDK ইনস্টল করতে হবে।
npm install @upstash/redis
তারপর আমাদের Redis এন্ডপয়েন্ট এবং পাসওয়ার্ড নিতে হবে Upstash কনসোল থেকে। তারপর, কোডে Redis ক্লায়েন্ট কনফিগার করুন যেটি আমরা Upstash Redis-এ কানেক্ট করব।
Upstash Redis দিয়ে Prisma কোয়েরি ক্যাশ করা
যে কথা বলেছিলাম এই ব্লগে আগে, আমরা cache-aside স্ট্র্যাটেজি ব্যবহার করব। সেটি করার জন্য, আমরা প্রথমে চেক করব ক্যাশে রিকোয়েস্ট করা ডেটা দেওয়া কোয়েরি দ্বারা এক্সিস্ট করে কিনা। যদি এক্সিস্ট করে, তবে আমরা Upstash Redis থেকে ফেচ করব এবং রিটার্ন করব। অন্যথায়, আমরা SQL ডেটাবেস কোয়েরি করব উপরে তৈরি Prisma ক্লায়েন্ট ব্যবহার করে এবং ক্যাশ পপুলেট করব SQL ডেটাবাস থেকে রিট্রিভ করা ডেটা দিয়ে।
import { Redis } from '@upstash/redis'; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); const redis = new Redis({ url: '', token: '', }) async function getUser(userId: string) { const cacheKey = `user:${userId}`; // Check cache const cachedUser = await redis.get(cacheKey); if (cachedUser) { console.log("Cache hit"); return JSON.parse(cachedUser); } // Query database console.log("Cache miss"); const user = await prisma.user.findUnique({ where: { id: userId }, }); // Store in cache if (user) { await redis.set(cacheKey, JSON.stringify(user), { ex: 3600 }); // Cache for 1 hour } return user; }
যেমন এই উদাহরণে দেখা যাচ্ছে, prisma. মেথডটি কোয়েরির শর্তগুলো ডিফাইন করে এমন প্যারামিটারসহ ডেভেলপারদের SQL ডেটাবেস কোয়েরি করতে দেয় কোড ফরম্যাটে।
শুধু উদাহরণ হিসেবে, আমরা user টেবিলের সব ইউজার রিট্রিভ করতে পারি findMany() ফাংশন ব্যবহার করে নিচের মতো:
const user = await prisma.user.findMany();
উপসংহার
এই ব্লগ পোস্টে, আমরা দেখেছি কীভাবে Prisma কে Upstash Redis-র সাথে ইন্টিগ্রেট করতে হয় Prisma কোয়েরি ক্যাশ করার জন্য।
Prisma এবং Upstash Redis দুটোই খুব সহজ এবং ব্যবহার করতে সহজ। তাদের ডেভেলপার-ফ্রেন্ডলি আর্কিটেকচারের পাশাপাশি, তারা কাফী 임প্যাক্টফুল। Prisma এর ম্যাপিং ফিচারের কারন 개발 সময় বড় পরিমাণ বাঁচাতে পারে যা ডেটাবেস ম্যানেজমেন্ট কোডিং ফরম্যাটে করতে দেয়। Upstash Redis দিয়ে Prisma কোয়েরি ক্যাশ করা ডেটা রিট্রিভের লেটেন্সি উল্লেখযোগ্যভাবে কমানো পারে এবং অ্যাপ্লিকেশনের মূল SQL ডেটাবেসের লোডও কমানো পারে।
আশা করি এই ব্লগ আপনাদের সবার সাহায্য করবে!