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

Sevalla-এ Redis ক্যাশিং দিয়ে Next.js API পারফরম্যান্স বাড়ান

Sevalla-এ Redis ক্যাশিং দিয়ে Next.js API পারফরম্যান্স বাড়ান

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

একটি আগের আর্টিকেলে, আমি Next.js API বিল্ড করা এবং Sevalla-এ ডিপ্লয় করার প্রক্রিয়া ব্যাখ্যা করেছিলাম। উদাহরণটি PostgreSQL ডাটাবেসে ডেটা স্টোর করত এবং সরাসরি রিকোয়েস্ট হ্যান্ডেল করত। এটা ঠিক কাজ করত, কিন্তু ট্রাফিক বেড়েলে, প্রতি রিকোয়েস্টে ডাটাবেস হিট করে APIগুলো স্লো হয়ে যেতে পারে।

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

গত আর্টিকেলে আমি API টি বিস্তারিত ব্যাখ্যা করেছিলাম। তাই আপনি এই রিপোজিটরি ব্যবহার করতে পারেন এই প্রজেক্টের বেস হিসেবে।

সূচিপত্র

  • কেন ক্যাশিং গুরুত্বপূর্ণ

  • Redis কী?

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

  • Redis প্রোভিশন করা

  • রিডের সময় ক্যাশ আপডেট করা

  • রাইটের সময় ক্যাশ আপডেট করা

  • Sevalla-এ ডিপ্লয় করা

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

  • উপসংহার

কেন ক্যাশিং গুরুত্বপূর্ণ

প্রতিবার আপনার API ডাটাবেস হিট করলে, এটি সময় এবং রিসোর্স খরচ করে। ডাটাবেসগুলো স্ট্রাকচারড ডেটা স্টোর এবং কোয়েরি করার জন্য চমৎকার, কিন্তু হাজার হাজার রিড রিকোয়েস্ট পার সেকেন্ড সার্ভ করার সময় স্পিডের জন্য অপ্টিমাইজড নয়।

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

উদাহরণস্বরূপ, যদি আপনি প্রতিবার রিকোয়েস্টে ডাটাবেস থেকে ইউজার লিস্ট ফেচ করেন, তবে কোয়েরি রান করে রেজাল্ট রিটার্ন করতে ২০০ms লাগতে পারে। Redis ক্যাশিংর সাথে, প্রথম রিকোয়েস্ট রেজাল্টটি মেমরিতে স্টোর করে, এবং পরের রিকোয়েস্টগুলো একই ডেটা ১০ms-এর কমে রিটার্ন করতে পারে। এটা ২০ গুণ উন্নতি।

Redis কী?

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

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

ট্র্যাডিশনাল ডাটাবেসের বিপরীতে, Redis সিমপ্লিসিটি এবং স্পিডে ফোকাস করে। এটি ডেটা কী-ভ্যালু পেয়ার হিসেবে স্টোর করে, তাই কমপ্লেক্স কোয়েরি লিখতে না হয়ে আপনি দ্রুত ভ্যালু ফেচ বা আপডেট করতে পারেন। এবং যেহেতু এটি লিস্ট, সেট, এবং হ্যাশের মতো অ্যাডভান্সড ডেটা টাইপ সাপোর্ট করে, এটি একটি প্লেইন কী-ভ্যালু স্টোর চেয়ে অনেক বেশি নমনীয়।

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

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

চলুন রিপোজিটরি ক্লোন করি:

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

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

cd next-api
npm i

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

cat .env

.env ফাইলটি এরকম দেখতে হবে:

PGSQL_URL=postgres://:-@asia-east1-001.proxy.kinsta.app:30503/

এখন নিশ্চিত করি অ্যাপ্লিকেশনটি এক্সপেক্টেড মতো কাজ করছে কিনা অ্যাপ শুরু করে এবং কয়েকটি API রিকোয়েস্ট করে।

অ্যাপ শুরু করা:

npm run dev

ডাটাবেস কানেক্টেড কিনা চেক করুন। ব্রাউজারে localhost:3000-এ যান। এটি নিচের JSON রিটার্ন করা উচিত:

Sevalla-এ Redis ক্যাশিং দিয়ে Next.js API পারফরম্যান্স বাড়ান

একটি নতুন ইউজার তৈরি করুন। Postman ব্যবহার করে DB-এ নতুন এন্ট্রি তৈরি করতে নিচের 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 দিয়ে ক্যাশ করি।

Redis প্রোভিশন করা

Sevalla-এর ড্যাশবোর্ডে যান এবং "Databases"-এ ক্লিক করুন। তালিকা থেকে "Redis" বেছে নিন, এবং বাকি অপশনগুলো ডিফল্ট রেখে দিন।

Sevalla-এ Redis ক্যাশিং দিয়ে Next.js API পারফরম্যান্স বাড়ান

ডাটাবেস তৈরি হলে, "external connection" অপশনটি অন করুন এবং পাবলিকলি এক্সেসযোগ্য URL কপি করুন।

Sevalla-এ Redis ক্যাশিং দিয়ে Next.js API পারফরম্যান্স বাড়ান

.env ফাইলে এটি এরকম দেখাবে:

REDIS_URL=redis://default:@:

এখন Node.js-র জন্য একটি Redis ক্লায়েন্ট ইনস্টল করুন:

npm install ioredis

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

রিডের সময় ক্যাশ আপডেট করা

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

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 {
    // প্রথমে ক্যাশ চেক করুন
    const cached = await redis.get("users");
    if (cached) {
      return NextResponse.json(JSON.parse(cached));
    }
    // ক্যাশে না থাকলে ডাটাবেসে ফallback
    const users = await readUsers();
    // রেজাল্ট ক্যাশে স্টোর করুন ৬০ সেকেন্ড 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. না থাকলে, PostgreSQL কোয়েরি করে, রেজাল্ট Redis-এ সেভ করে, এবং তারপর রিটার্ন করে।

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

Redis ক্যাশিং ছাড়া, /users দশবার ফেচ করলে মানে দশবার ডাটাবেস কোয়েরি। প্রতিটি প্রায় ১৫০-২০০ms নিতে পারে ডাটাবেস সাইজ এবং নেটওয়ার্ক লেটেন্সির উপর নির্ভর করে।

Redis-র সাথে, প্রথম রিকোয়েস্টটিও প্রায় ২০০ms নেয় কারণ এটি ক্যাশ পপুলেট করে। কিন্তু এর পরের সব রিকোয়েস্ট প্রায় ইনস্ট্যান্ট, প্রায়শই ১০ms-এর নিচে। এটা ২০ গুণ উন্নতি।

এই স্পিডআপ জরুরি যখন আপনার 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();
    // ক্যাশ ইনভ্যালিডেট করুন যেন পরের GET ফ্রেশ ডেটা ফেচ করে
    await redis.del("users");
    return NextResponse.json(result.rows[0]);
  } catch (err) {
    return NextResponse.json({ error: "Failed to add user" }, { status: 500 });
  }
}

এখন যখনই একটি নতুন ইউজার তৈরি হবে, users-এর ক্যাশ ক্লিয়ার হয়ে যাবে। পরের GET রিকোয়েস্ট ডাটাবেস থেকে ফেচ করবে, ক্যাশ রিফ্রেশ করবে, এবং তারপর ক্যাশড ডেটা সার্ভ করতে থাকবে।

Sevalla-এ ডিপ্লয় করা

আপনার কোড GitHub-এ পুশ করুন বা আমার রিপোজিটরি ফরক করুন। এখন Sevalla-এ যান এবং একটি নতুন অ্যাপ তৈরি করুন।

Sevalla-এ Redis ক্যাশিং দিয়ে Next.js API পারফরম্যান্স বাড়ান

ড্রপডাউন থেকে আপনার রিপোজিটরি বেছে নিন এবং "Automatic deployment on commit" চেক করুন। এটি নিশ্চিত করবে যে প্রতিবার কোড পুশ করলে ডিপ্লয়মেন্ট অটোমেটিক হবে। রিসোর্স সেকশনে "Hobby" বেছে নিন।

Sevalla-এ Redis ক্যাশিং দিয়ে Next.js API পারফরম্যান্স বাড়ান

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

"Environment variables" সেকশনে যান এবং key "PGSQL_URL" এবং URL ভ্যালু ফিল্ডে যোগ করুন। একইভাবে "REDIS_URL" key এবং Redis URL যোগ করুন।

Sevalla-এ Redis ক্যাশিং দিয়ে Next.js API পারফরম্যান্স বাড়ান

এখন "Overview" সেকশনে ফিরে যান এবং "Deploy now" ক্লিক করুন।

Sevalla-এ Redis ক্যাশিং দিয়ে Next.js API পারফরম্যান্স বাড়ান

ডিপ্লয়মেন্ট কমপ্লিট হলে, "Visit app" ক্লিক করে আপনার API-এর লাইভ URL পান। Postman-এ localhost:3000 কে নতুন URL দিয়ে রিপ্লেস করে আপনার API টেস্ট করুন।

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

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

  • API রুটগুলো সার্ভার-সাইডে রান করে যেখানে Redis সরাসরি কোয়েরি করা যায়।

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

  • Redis ক্যাশিং ছাড়াও আরও অনেক কাজে ব্যবহার করা যায় — রেট লিমিটিং, সেশন স্টোরেজ, এবং পাব/সাব ও কমন প্যাটার্ন।

Next.js, PostgreSQL, এবং Redis কে Sevalla-এ কম্বাইন করে, আপনি একটি স্ট্যাক পাবেন যা ফাস্ট, স্কেলেবল, এবং ডিপ্লয় করা সহজ।

উপসংহার

ক্যাশিং শুধু একটি অপ্টিমাইজেশন নয় — এটি রিয়েল-ওয়ার্ল্ড API-র জন্য একটি απαয়বশ্যকতা। Next.js আপনাকে রবাস্ট ব্যাকএন্ড API বিল্ড করতে সাহায্য করে যা সহজে ডিপ্লয় করা যায়। Redis যোগ করলে সেই APIগুলো পশি ছাড়া স্কেল হ্যান্ডেল করতে পারে।

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

আশা করি আপনি এই আর্টিকেলটি উপভোগ করেছেন। আমার ফ্রি AI নিউজলেটার TuringTalks.ai সাইন আপ করুন আরও হ্যান্ডস-অন AI টিউটোরিয়ালের জন্য। আপনি আমাকে Linkedinএও খুঁজে পাবেন।

নিঃশুল্ক কোডিং শিখুন। freeCodeCamp-এর ওপেন সোর্স কারিকুলাম ৪০,০০০-এর বেশি মানুষকে ডেভেলপার হিসেবে জব পেতে সাহায্য করেছে। শুরু করুন

  1. HTML অ্যাট্রিবিউটের বদলে CSS দিয়ে ফেভিকন সাইজ সেট করা

  2. Android-এ AlertDialog-এ চেকবক্স লিস্ট যোগ করার উপায়

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

  4. Matplotlib-এ টেকনিক্যাল ড্রইং-এ দূরত্ব বানানোর পদ্ধতি