🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

একটি Node.js অ্যাপে ক্যাশিংয়ের জন্য কীভাবে রেডিস ব্যবহার করবেন: সম্পূর্ণ 2026 গাইড

⏱️3 min read  ·  458 words

রেডিস একটি ইন-মেমরি ডেটা স্টোর যা নাটকীয়ভাবে ব্যয়বহুল ডাটাবেস প্রশ্ন এবং API প্রতিক্রিয়াগুলি ক্যাশ করে অ্যাপ্লিকেশনগুলির গতি বাড়ায়। একটি ভালভাবে স্থাপন করা ক্যাশে একটি 200ms ডাটাবেস ক্যোয়ারীকে 2ms ক্যাশে হিটে পরিণত করতে পারে। এই নির্দেশিকাটি সঠিক উপায়ে একটি Node.js অ্যাপে Redis ক্যাশিং যোগ করে।

📋 Table of Contents

  1. কেন Redis সঙ্গে ক্যাশে?
  2. ক্যাশে-সাইড প্যাটার্ন (সবচেয়ে সাধারণ)
  3. প্রথমে ক্যাশে চেক করুন; একটি মিস হলে, ডাটাবেস থেকে আনুন এবং ক্যাশে পূরণ করুন:
  4. ক্যাশে অবৈধকরণ (হার্ড পার্ট)
  5. রুট ক্যাশিংয়ের জন্য এক্সপ্রেস মিডলওয়্যার
  6. রেডিসের সাথে রেট লিমিটিং
  7. ক্যাশিং সেরা অভ্যাস
  8. সর্বদা একটি TTL সেট করুন:
  9. প্রশ্ন: আমার কী ক্যাশে করা উচিত নয়?
  10. Redis ক্যাশিং আপনার Node.js অ্যাপের কর্মক্ষমতাকে রূপান্তরিত করতে পারে — ধীরগতির ডাটাবেস প্রশ্নগুলিকে তাত্ক্ষণিক ক্যাশে হিটে পরিণত করে। একটি পুনঃব্যবহারযোগ্য র‍্যাপার সহ ক্যাশে-সাইড প্যাটার্নটি বেশিরভাগ চাহিদাকে কভার করে, রুট-লেভেল মিডলওয়্যার সম্পূর্ণ প্রতিক্রিয়াগুলিকে ক্যাশে করে এবং একই রেডিস উদাহরণ রেট লিমিটিং এবং সেশন পরিচালনা করে। দুটি কঠিন অংশ মনে রাখবেন: সর্বদা একটি TTL সেট করুন এবং ডেটা পরিবর্তন হলে ক্যাশে বাতিল করুন। Redis ব্যর্থতাগুলিকে সুন্দরভাবে পরিচালনা করুন এবং আপনার অ্যাপ একই সময়ে দ্রুত এবং আরও স্থিতিস্থাপক হয়ে ওঠে৷

কেন Redis সঙ্গে ক্যাশে?

  • গতিঃ ইন-মেমরি রিড ডাটাবেস কোয়েরির চেয়ে 10-100x দ্রুত হয়
  • ডাটাবেস লোড হ্রাস করুন: আপনার ডাটাবেসকে বাঁচিয়ে ক্যাশে থেকে বারবার অনুরোধগুলি পরিবেশন করুন
  • স্কেল: আপনার প্রাথমিক ডেটাস্টোরকে অভিভূত না করেই ট্র্যাফিক স্পাইকগুলি পরিচালনা করুন বহুমুখী:
  • এছাড়াও সেশন, রেট লিমিটিং, সারি এবং পাব/সাবপরিচালনা করে সেটআপ

ক্যাশে-সাইড প্যাটার্ন (সবচেয়ে সাধারণ)

npm install ioredis

# Run Redis locally with Docker
docker run -d --name redis -p 6379:6379 redis:7-alpine
// redis.js — connection singleton
import Redis from 'ioredis';

export const redis = new Redis({
  host: process.env.REDIS_HOST || 'localhost',
  port: parseInt(process.env.REDIS_PORT || '6379'),
  maxRetriesPerRequest: 3,
  retryStrategy: (times) => Math.min(times * 50, 2000),
});

redis.on('error', (err) => console.error('Redis error:', err));
redis.on('connect', () => console.log('Redis connected'));

প্রথমে ক্যাশে চেক করুন; একটি মিস হলে, ডাটাবেস থেকে আনুন এবং ক্যাশে পূরণ করুন:

পুনঃব্যবহারযোগ্য ক্যাশে মোড়ক

import { redis } from './redis';

async function getUser(userId) {
  const cacheKey = `user:${userId}`;

  // 1. Try cache first
  const cached = await redis.get(cacheKey);
  if (cached) {
    return JSON.parse(cached);  // cache hit — fast path
  }

  // 2. Cache miss — fetch from database
  const user = await db.users.findById(userId);
  if (!user) return null;

  // 3. Populate cache with a TTL (expire after 1 hour)
  await redis.set(cacheKey, JSON.stringify(user), 'EX', 3600);

  return user;
}

ক্যাশে অবৈধকরণ (হার্ড পার্ট)

async function cached(key, ttlSeconds, fetchFn) {
  const hit = await redis.get(key);
  if (hit) return JSON.parse(hit);

  const data = await fetchFn();
  if (data !== null && data !== undefined) {
    await redis.set(key, JSON.stringify(data), 'EX', ttlSeconds);
  }
  return data;
}

// Usage — clean and reusable
const products = await cached('products:featured', 600, () =>
  db.products.findFeatured()
);

const user = await cached(`user:${id}`, 3600, () =>
  db.users.findById(id)
);

রুট ক্যাশিংয়ের জন্য এক্সপ্রেস মিডলওয়্যার

// When data changes, invalidate the cache to avoid stale reads

async function updateUser(userId, updates) {
  const user = await db.users.update(userId, updates);

  // Invalidate the cached version
  await redis.del(`user:${userId}`);

  // Invalidate related caches too
  await redis.del('users:list');

  return user;
}

// Invalidate by pattern (use SCAN, not KEYS, in production)
async function invalidatePattern(pattern) {
  const stream = redis.scanStream({ match: pattern, count: 100 });
  stream.on('data', (keys) => {
    if (keys.length) redis.del(...keys);
  });
}
// invalidatePattern('user:*');  // clear all user caches

রেডিসের সাথে রেট লিমিটিং

function cacheRoute(ttlSeconds) {
  return async (req, res, next) => {
    const key = `route:${req.originalUrl}`;
    const cached = await redis.get(key);

    if (cached) {
      res.setHeader('X-Cache', 'HIT');
      return res.json(JSON.parse(cached));
    }

    // Override res.json to cache the response
    const originalJson = res.json.bind(res);
    res.json = (body) => {
      redis.set(key, JSON.stringify(body), 'EX', ttlSeconds);
      res.setHeader('X-Cache', 'MISS');
      return originalJson(body);
    };
    next();
  };
}

// Cache this route for 5 minutes
app.get('/api/products', cacheRoute(300), getProducts);

ক্যাশিং সেরা অভ্যাস

async function rateLimit(req, res, next) {
  const key = `ratelimit:${req.ip}`;
  const limit = 100;      // requests
  const window = 60;      // seconds

  const current = await redis.incr(key);
  if (current === 1) {
    await redis.expire(key, window);  // set TTL on first request
  }

  if (current > limit) {
    return res.status(429).json({ error: 'Too many requests' });
  }

  res.setHeader('X-RateLimit-Remaining', Math.max(0, limit - current));
  next();
}

সর্বদা একটি TTL সেট করুন:

  • বাসি ডেটাকে চিরকাল বেঁচে থাকতে বাধা দেয় এবং স্মৃতি নিয়ন্ত্রণ করেক্যাশে যা ব্যয়বহুল এবং প্রায়শই পড়া হয়:
  • সব কিছু ক্যাশে করবেন না — ক্যাশে গরম পথগুলিক্যাশে ব্যর্থতাগুলিকে সুন্দরভাবে পরিচালনা করুন:
  • যদি রেডিস ডাউন থাকে, ডাটাবেসে পড়ে যান, ক্রাশ করবেন নাসামঞ্জস্যপূর্ণ কী নামকরণ ব্যবহার করুন:
  • কনভেনশনগুলি অবৈধকে অনুমানযোগ্য করে তোলে entity:id:fieldউৎপাদনে KEYS কমান্ড এড়িয়ে চলুন:
  • এটি রেডিসকে ব্লক করে — পরিবর্তে SCAN ব্যবহার করুনক্যাশে স্ট্যাম্পেডের জন্য দেখুন:
  • যখন একটি জনপ্রিয় কী মেয়াদ শেষ হয়ে যায়, অনেক অনুরোধ একবারে ডাটাবেসে আঘাত করে — লক বা অচল টিটিএল ব্যবহার করুনপ্রায়শই জিজ্ঞাসিত প্রশ্ন

প্রশ্ন: আমার কী ক্যাশে করা উচিত নয়?

উত্তর: অত্যন্ত উদ্বায়ী ডেটা যা প্রতিটি অনুরোধ পরিবর্তন করে, যথাযথ নিরাপত্তা ছাড়াই সংবেদনশীল ডেটা এবং গণনা করা সস্তা ডেটা৷ ব্যয়বহুল, ঘন ঘন পঠিত, তুলনামূলকভাবে স্থিতিশীল ডেটা ক্যাশে করুন।
প্রশ্ন: আমি কিভাবে একটি TTL নির্বাচন করব?

উত্তর: ভারসাম্য সতেজতা বনাম কর্মক্ষমতা। ব্যবহারকারীর প্রোফাইল: 1 ঘন্টা। পণ্য তালিকা: 5-10 মিনিট। রিয়েল-টাইম ডেটা: সেকেন্ড বা ক্যাশে না। কত ঘন ঘন ডেটা আসলে পরিবর্তিত হয় তার সাথে TTL এর সাথে মিল করুন।
প্রশ্নঃ রেডিস নিচে গেলে কি হবে?

উত্তর: আপনার অ্যাপটি ভালভাবে অবনমিত হওয়া উচিত — Redis এর ত্রুটিগুলি ধরুন এবং ডাটাবেসের মধ্যে পড়ুন। ক্যাশে ব্যর্থতাকে কখনই আপনার অ্যাপটি সরিয়ে নিতে দেবেন না। ক্যাশে কলগুলিকে ট্রাই/ক্যাচে মোড়ানো।
প্রশ্ন: রেডিস বনাম ইন-মেমরি ক্যাশিং (জেএস ম্যাপের মতো)?

উত্তর: ইন-মেমরি ম্যাপ ক্যাশেগুলি প্রতি-প্রক্রিয়া (পুনরায় চালু করার সময় হারিয়ে যায়, বিভিন্ন দৃষ্টান্তে ভাগ করা হয় না)। Redis আপনার সমস্ত অ্যাপ ইন্সট্যান্স জুড়ে শেয়ার করা হয় এবং টিকে থাকে — অনুভূমিকভাবে স্কেল করা অ্যাপের জন্য অপরিহার্য।
প্রশ্ন: আমি কিভাবে ক্যাশে স্ট্যাম্পেড প্রতিরোধ করতে পারি?

উত্তর: একটি লক (SET NX) ব্যবহার করুন যাতে শুধুমাত্র একটি অনুরোধ ক্যাশে রিফ্রেশ করে যখন অন্যরা অপেক্ষা করে বা পুরানো ডেটা পরিবেশন করে, অথবা TTL-এ এলোমেলো ঝাঁকুনি যোগ করে যাতে জনপ্রিয় কী একই সাথে শেষ না হয়।
উপসংহার

Redis ক্যাশিং আপনার Node.js অ্যাপের কর্মক্ষমতাকে রূপান্তরিত করতে পারে — ধীরগতির ডাটাবেস প্রশ্নগুলিকে তাত্ক্ষণিক ক্যাশে হিটে পরিণত করে। একটি পুনঃব্যবহারযোগ্য র‍্যাপার সহ ক্যাশে-সাইড প্যাটার্নটি বেশিরভাগ চাহিদাকে কভার করে, রুট-লেভেল মিডলওয়্যার সম্পূর্ণ প্রতিক্রিয়াগুলিকে ক্যাশে করে এবং একই রেডিস উদাহরণ রেট লিমিটিং এবং সেশন পরিচালনা করে। দুটি কঠিন অংশ মনে রাখবেন: সর্বদা একটি TTL সেট করুন এবং ডেটা পরিবর্তন হলে ক্যাশে বাতিল করুন। Redis ব্যর্থতাগুলিকে সুন্দরভাবে পরিচালনা করুন এবং আপনার অ্যাপ একই সময়ে দ্রুত এবং আরও স্থিতিস্থাপক হয়ে ওঠে৷

Redis ক্যাশিং আপনার Node.js অ্যাপের কর্মক্ষমতাকে রূপান্তরিত করতে পারে — ধীরগতির ডাটাবেস প্রশ্নগুলিকে তাত্ক্ষণিক ক্যাশে হিটে পরিণত করে। একটি পুনঃব্যবহারযোগ্য র‍্যাপার সহ ক্যাশে-সাইড প্যাটার্নটি বেশিরভাগ চাহিদাকে কভার করে, রুট-লেভেল মিডলওয়্যার সম্পূর্ণ প্রতিক্রিয়াগুলিকে ক্যাশে করে এবং একই রেডিস উদাহরণ রেট লিমিটিং এবং সেশন পরিচালনা করে। দুটি কঠিন অংশ মনে রাখবেন: সর্বদা একটি TTL সেট করুন এবং ডেটা পরিবর্তন হলে ক্যাশে বাতিল করুন। Redis ব্যর্থতাগুলিকে সুন্দরভাবে পরিচালনা করুন এবং আপনার অ্যাপ একই সময়ে দ্রুত এবং আরও স্থিতিস্থাপক হয়ে ওঠে৷

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা