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

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

যখন আপনি Next.js সম্পর্কে শুনবেন, তখন আপনার প্রথম চিন্তা স্ট্যাটিক ওয়েবসাইট বা প্রতিক্রিয়া-চালিত ফ্রন্টএন্ড হতে পারে। কিন্তু এটা গল্পের অংশ মাত্র। Next.js পূর্ণ-বৈশিষ্ট্যযুক্ত ব্যাকএন্ড APIগুলিকেও শক্তি দিতে পারে যা আপনি হোস্ট করতে পারেন এবং অন্য যেকোনো ব্যাকএন্ড পরিষেবার মতো স্কেল করতে পারেন৷

একটি পূর্ববর্তী নিবন্ধে, আমি একটি Next.js API তৈরি এবং সেভাল্লার সাথে এটি স্থাপনের মাধ্যমে হেঁটেছি। উদাহরণটি একটি PostgreSQL ডাটাবেসে ডেটা সংরক্ষণ করে এবং সরাসরি অনুরোধগুলি পরিচালনা করে। এটি ঠিক কাজ করেছে, কিন্তু ট্রাফিক বাড়ার সাথে সাথে প্রতিটি অনুরোধে ডাটাবেসে আঘাতকারী APIগুলি ধীর হয়ে যেতে পারে৷

এখানেই ক্যাশিং আসে। Redis কে ক্যাশে লেয়ার হিসেবে যুক্ত করার মাধ্যমে আমরা আমাদের Next.js APIকে অনেক দ্রুত এবং আরও দক্ষ করে তুলতে পারি। এই নিবন্ধে, আমরা কীভাবে আমাদের API-তে Redis ক্যাশিং যোগ করতে, সেভাল্লার সাথে এটি স্থাপন করতে এবং পরিমাপযোগ্য উন্নতিগুলি দেখাব তা দেখব৷

গত প্রবন্ধে, আমি বিস্তারিতভাবে API ব্যাখ্যা করেছি। সুতরাং আপনি এই প্রকল্পের ভিত্তি হিসাবে শুরু করতে এই সংগ্রহস্থলটি ব্যবহার করতে পারেন৷

সূচিপত্র

  • কেন ক্যাশিং ব্যাপার

  • রেডিস কি?

  • প্রজেক্ট সেট আপ করা হচ্ছে

  • প্রভিশনিং রেডিস

  • রিডগুলিতে ক্যাশে আপডেট করা হচ্ছে

  • লেখার উপর ক্যাশে আপডেট করা হচ্ছে

  • সেভাল্লায় স্থাপন করা হচ্ছে

  • কেন Redis Next.js APIs

    এর সাথে ভাল কাজ করে
  • উপসংহার

কেন ক্যাশিং ব্যাপার

প্রতিবার আপনার API ডাটাবেসে আঘাত করে, এটি সময় এবং সংস্থান খরচ করে। ডেটাবেসগুলি স্ট্রাকচার্ড ডেটা সঞ্চয় এবং অনুসন্ধানের ক্ষেত্রে দুর্দান্ত, কিন্তু যখন আপনাকে প্রতি সেকেন্ডে হাজার হাজার পঠিত অনুরোধ পরিবেশন করতে হয় তখন সেগুলি স্কেলে গতির জন্য অপ্টিমাইজ করা হয় না৷

ঘন ঘন অ্যাক্সেস করা ডেটা মেমরিতে রেখে ক্যাশিং এর সমাধান করে। প্রতিবার ডাটাবেস জিজ্ঞাসা করার পরিবর্তে, API সরাসরি ক্যাশে থেকে ডেটা ফেরত দিতে পারে যদি এটি উপলব্ধ থাকে। রেডিস এর জন্য উপযুক্ত কারণ এটি একটি ইন-মেমরি কী-ভ্যালু স্টোর যা পারফরম্যান্সের জন্য ডিজাইন করা হয়েছে।

উদাহরণস্বরূপ, আপনি যদি প্রতিটি অনুরোধে ডাটাবেস থেকে ব্যবহারকারীদের তালিকা আনেন, তাহলে ক্যোয়ারী চালাতে এবং ফলাফল ফেরাতে 200ms সময় লাগতে পারে। রেডিস ক্যাশিংয়ের মাধ্যমে, প্রথম অনুরোধটি ফলাফলটিকে মেমরিতে সংরক্ষণ করে, এবং পরবর্তী অনুরোধগুলি 10ms এর কম সময়ে একই ডেটা ফেরত দিতে পারে। এটি একটি ক্রমাগত উন্নতি।

Redis কি?

রেডিস একটি ইন-মেমরি ডেটা স্টোর যা একটি সুপার-ফাস্ট ডাটাবেসের মতো কাজ করে। ডিস্ক থেকে লেখা এবং পড়ার পরিবর্তে, এটি মেমরিতে ডেটা রাখে, যা এটিকে অবিশ্বাস্যভাবে দ্রুত করে তোলে। তাই এটি প্রায়শই ক্যাশে হিসাবে ব্যবহৃত হয়, যেখানে দীর্ঘমেয়াদী স্টোরেজের চেয়ে গতি বেশি গুরুত্বপূর্ণ।

এটি খুব কম লেটেন্সি সহ উচ্চ-থ্রুপুট ওয়ার্কলোডগুলি পরিচালনা করার জন্য ডিজাইন করা হয়েছে, যার মানে এটি মাইক্রোসেকেন্ডে প্রতিক্রিয়া জানাতে পারে। এটি API প্রতিক্রিয়া ক্যাশিং, সেশন ডেটা সংরক্ষণ বা এমনকি চ্যাট সিস্টেম এবং লিডারবোর্ডের মতো রিয়েল-টাইম অ্যাপ্লিকেশনগুলিকে পাওয়ার মতো ব্যবহারের ক্ষেত্রে এটিকে উপযুক্ত করে তোলে৷

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

যখন আমরা Next.js-এ তৈরি করা একটি API-এর সাথে একত্রিত হয়, তখন Redis আপনাকে প্রধান ডাটাবেসের লোড কমাতে এবং ক্লায়েন্টদের কাছে উজ্জ্বল-দ্রুত প্রতিক্রিয়া প্রদান করতে সাহায্য করে।

প্রজেক্ট সেট আপ করা

চলুন সংগ্রহস্থল ক্লোন করা যাক:

git clone git@github.com:manishmshiva/nextjs-api-pgsql.git next-api

এখন ডিরেক্টরিতে যাই এবং প্যাকেজগুলি ইনস্টল করার জন্য একটি npm ইনস্টল করি৷

cd next-api
npm i

একটি .env ফাইল তৈরি করুন এবং সেভাল্লা থেকে একটি এনভায়রনমেন্ট ভেরিয়েবলে ডাটাবেস URL যোগ করুন৷

cat .env

.env ফাইলটি এইরকম হওয়া উচিত:

PGSQL_URL=postgres://<username>:<password>-@asia-east1-001.proxy.kinsta.app:30503/<db_name>

এখন অ্যাপ্লিকেশনটি শুরু করে এবং কয়েকটি API অনুরোধ করে অ্যাপ্লিকেশনটি আশানুরূপ কাজ করছে তা নিশ্চিত করুন৷

অ্যাপ শুরু করা হচ্ছে:

npm run dev

আসুন নিশ্চিত করি যে ডাটাবেস সংযুক্ত আছে। localhost:3000-এ যান আপনার ব্রাউজারে। এটি নিম্নলিখিত JSON ফেরত দেবে:

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

আসুন একটি নতুন ব্যবহারকারী তৈরি করি। পোস্টম্যান ব্যবহার করে ডিবিতে একটি নতুন এন্ট্রি তৈরি করতে, নিম্নলিখিত JSON-এর সাথে একটি POST অনুরোধ পাঠান:

{"id":"d9553bb7-2c72-4d92-876b-9c3b40a8c62c","name":"Larry","email":"larry@example.com","age":"25"}

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

localhost:3000/users-এ গিয়ে রেকর্ড তৈরি হয়েছে তা নিশ্চিত করা যাক ব্রাউজারে।

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

দারুণ। এখন রেডিস ব্যবহার করে এই API গুলো ক্যাশে করা যাক।

প্রভিশনিং রিডিস

চলুন সেভাল্লার ড্যাশবোর্ডে যান এবং "ডেটাবেস" এ ক্লিক করুন। তালিকা থেকে "Redis" চয়ন করুন এবং বাকি বিকল্পগুলিকে ডিফল্ট হিসাবে ছেড়ে দিন৷

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

ডাটাবেস তৈরি হয়ে গেলে, "বাহ্যিক সংযোগ" বিকল্পটি চালু করুন এবং সর্বজনীনভাবে অ্যাক্সেসযোগ্য URLটি অনুলিপি করুন৷

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

.env ফাইলে এটি দেখতে এইরকম হওয়া উচিত:

REDIS_URL=redis://default:<password>@<host>:<port>

এখন Node.js:

এর জন্য একটি Redis ক্লায়েন্ট ইনস্টল করুন
npm install ioredis

আমরা এখন Redis এর সাথে সংযোগ করতে পারি এবং এটিকে আমাদের ব্যবহারকারীদের API-এর জন্য ক্যাশে স্তর হিসাবে ব্যবহার করতে পারি। আসুন দেখি কিভাবে ক্যাশিং বাস্তবায়ন করা যায়।

পঠিত ক্যাশে আপডেট করা হচ্ছে

এখানে আপডেট করা users/route.ts আছে যেটি Redis ব্যবহার করে:

import { NextResponse } from "next/server";
import { Client } from "pg";
import Redis from "ioredis";
const redis = new Redis(process.env.REDIS_URL!);
async function readUsers() {
 const client = new Client({
 connectionString: process.env.PGSQL_URL,
 });
 await client.connect();
 try {
 const result = await client.query("SELECT id, name, email, age FROM users");
 return result.rows;
 } finally {
 await client.end();
 }
}
export async function GET() {
 try {
 // Check cache first
 const cached = await redis.get("users");
 if (cached) {
 return NextResponse.json(JSON.parse(cached));
 }
 // Fallback to database if not cached
 const users = await readUsers();
 // Store result in cache with 60s TTL
 await redis.set("users", JSON.stringify(users), "EX", 60);
 return NextResponse.json(users);
 } catch (err) {
 return NextResponse.json({ error: "Failed to fetch users" }, { status: 500 });
 }
}

এখন, যখন আপনি /users হিট করবেন :

  1. API প্রথমে Redis চেক করে।

  2. যদি ডেটা বিদ্যমান থাকে তবে এটি তাৎক্ষণিকভাবে ফিরিয়ে দেয়।

  3. যদি না হয়, এটি পোস্টগ্রেএসকিউএলকে জিজ্ঞাসা করে, ফলাফলটি রেডিসে সংরক্ষণ করে এবং তারপরে এটি ফেরত দেয়৷

এটি বারবার অনুরোধ অত্যন্ত দ্রুত করে তোলে। আপনি ক্যাশের মেয়াদ সামঞ্জস্য করতে পারেন (EX 60 ) আপনার ডেটা কতটা তাজা হতে হবে তার উপর নির্ভর করে।

Redis ক্যাশিং ছাড়াই, /users আনা হচ্ছে দশ বার মানে দশ ডাটাবেস প্রশ্ন। ডাটাবেসের আকার এবং নেটওয়ার্ক লেটেন্সির উপর নির্ভর করে প্রতিটিতে প্রায় 150-200ms সময় লাগতে পারে।

Redis এর সাথে, প্রথম অনুরোধটি এখনও 200ms সময় নেয় কারণ এটি ক্যাশে পূরণ করে। কিন্তু তার পরে প্রতিটি অনুরোধ প্রায় তাত্ক্ষণিক, প্রায়ই 10ms এর নিচে। এটি একটি 20x উন্নতি .

যখন আপনার API প্রতি সেকেন্ডে শত শত বা হাজার হাজার অনুরোধের সম্মুখীন হয় তখন এই স্পীডআপ গুরুত্বপূর্ণ। ক্যাশিং শুধুমাত্র লেটেন্সি কমায় না বরং আপনার ডাটাবেসের লোডও হালকা করে।

লেখাতে ক্যাশে আপডেট করা হচ্ছে

এই মুহূর্তে, শুধুমাত্র GET অনুরোধ ক্যাশে ব্যবহার করে। কিন্তু আমরা যদি নতুন ব্যবহারকারী যোগ করি? ক্যাশে এখনও পুরানো ডেটা ফেরত দেবে৷

সমাধান হল যখনই একটি লেখা হয় তখন ক্যাশে আপডেট করা বা সাফ করা। চলুন POST আপডেট করি হ্যান্ডলার:

export async function POST(req: Request) {
 try {
 const body = await req.json();
 const client = new Client({
 connectionString: process.env.PGSQL_URL,
 });
 await client.connect();
 const query = `
 INSERT INTO users (id, name, email, age)
 VALUES ($1, $2, $3, $4)
 RETURNING *;
 `;
 const result = await client.query(query, [
 body.id,
 body.name,
 body.email,
 body.age,
 ]);
 await client.end();
 // Invalidate cache so next GET fetches fresh data
 await redis.del("users");
 return NextResponse.json(result.rows[0]);
 } catch (err) {
 return NextResponse.json({ error: "Failed to add user" }, { status: 500 });
 }
}

এখন যখনই একটি নতুন ব্যবহারকারী তৈরি করা হয়, users এর ক্যাশে পরিষ্কার করা হয়। পরবর্তী GET অনুরোধ ডাটাবেস থেকে আনবে, ক্যাশে রিফ্রেশ করবে এবং তারপর ক্যাশে করা ডেটা পরিবেশন করা চালিয়ে যাবে।

সেভাল্লায় স্থাপন করা হচ্ছে

আপনার কোডটি GitHub-এ পুশ করুন বা আমার সংগ্রহস্থলে ফোর্ক করুন। এখন সেভাল্লায় যান এবং একটি নতুন অ্যাপ তৈরি করুন৷

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

ড্রপডাউন থেকে আপনার সংগ্রহস্থল চয়ন করুন এবং "কমিটে স্বয়ংক্রিয় স্থাপনা" চেক করুন। এটি নিশ্চিত করবে যে প্রতিবার আপনি কোড পুশ করার সময় ডিপ্লয়মেন্ট স্বয়ংক্রিয় হয়। সম্পদ বিভাগের অধীনে "শখ" নির্বাচন করুন৷

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

"তৈরি করুন" ক্লিক করুন এবং "তৈরি করুন এবং স্থাপন করুন" এ ক্লিক করুন। আমরা পরিবেশ ভেরিয়েবল হিসাবে আমাদের PostgreSQL URL এবং Redis URL যোগ করিনি, তাই আপনি এটি স্থাপন করার চেষ্টা করলে অ্যাপটি ক্র্যাশ হয়ে যাবে।

"এনভায়রনমেন্ট ভেরিয়েবল" বিভাগে যান এবং মান ক্ষেত্রে "PGSQL_URL" কী এবং URL যোগ করুন। “REDIS_URL” কী-এর জন্য একই কাজ করুন এবং Redis URL যোগ করুন।

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

এখন "ওভারভিউ" বিভাগে ফিরে যান এবং "এখনই স্থাপন করুন" এ ক্লিক করুন৷

Sevalla-এ Redis ক্যাশিং সহ Next.js API পারফরম্যান্স বুস্ট করুন

একবার স্থাপনা সম্পূর্ণ হলে, আপনার API এর লাইভ URL পেতে "অ্যাপ দেখুন" এ ক্লিক করুন। আপনি পোস্টম্যানে নতুন URL দিয়ে localhost:3000 প্রতিস্থাপন করতে পারেন এবং আপনার API পরীক্ষা করতে পারেন।

কেন Redis Next.js API এর সাথে ভাল কাজ করে

Redis লাইটওয়েট, দ্রুত জ্বলন্ত, এবং API প্রতিক্রিয়া ক্যাশ করার জন্য উপযুক্ত। Next.js এর প্রেক্ষাপটে, এটি স্বাভাবিকভাবেই ফিট করে কারণ:

  • API রুটগুলি সার্ভার-সাইডে চলে যেখানে রেডিসকে সরাসরি জিজ্ঞাসা করা যেতে পারে৷

  • ক্যাশিং লজিক ডাটাবেস কলের চারপাশে যোগ করা সহজ।

  • রেডিস ক্যাশিংয়ের চেয়েও বেশি কিছুর জন্য ব্যবহার করা যেতে পারে - রেট লিমিটিং, সেশন স্টোরেজ এবং পাব/সাবের মতো জিনিসগুলিও সাধারণ প্যাটার্ন।

Sevalla-এ Next.js, PostgreSQL এবং Redis একত্রিত করার মাধ্যমে, আপনি একটি স্ট্যাক পাবেন যা দ্রুত, মাপযোগ্য এবং স্থাপন করা সহজ।

উপসংহার

ক্যাশিং শুধুমাত্র একটি অপ্টিমাইজেশান নয় - এটি বাস্তব-বিশ্ব API-এর জন্য একটি প্রয়োজনীয়তা। Next.js আপনাকে শক্তিশালী ব্যাকএন্ড API তৈরি করতে সাহায্য করে যা সহজেই স্থাপন করা যায়। মিশ্রণে Redis যোগ করে, সেই APIগুলি ঘাম না ভেঙে স্কেল পরিচালনা করতে পারে৷

Sevalla এক জায়গায় পরিচালিত PostgreSQL, Redis, এবং অ্যাপ হোস্টিং প্রদান করে এটিকে একত্রিত করে। কিছু এনভায়রনমেন্ট ভেরিয়েবল এবং একটি GitHub রেপো সহ, আপনি স্থানীয় dev থেকে একটি প্রোডাকশন-রেডি, ক্যাশে করা API-তে মিনিটের মধ্যে যেতে পারেন৷

আশা করি আপনি এই নিবন্ধটি উপভোগ করেছেন। আমার বিনামূল্যের এআই নিউজলেটারর জন্য সাইন আপ করুন৷ TuringTalks.ai এআই-এর উপর আরও টিউটোরিয়ালের জন্য। এছাড়াও আপনি আমাকে খুঁজে পেতে পারেন লিঙ্কডইন

বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন


  1. এইচটিএমএল ডম স্টাইল বর্ডার রাইট প্রপার্টি

  2. অবজেক্ট রকেট পরিষেবাতে পরিচালিত টাইমস্কেল

  3. HTML DOM Bdo অবজেক্ট

  4. CSS এ ফ্লোট প্রপার্টি ব্যবহার করে বাম এবং ডান প্রান্তিককরণ