High Performance Backend: Scaling APIs with Redis In-Memory Caching
যখন কোনো অ্যাপ্লিকেশনে প্রতি সেকেন্ডে হাজার হাজার রিকোয়েস্ট আসে, তখন বারবার মেইন ডাটাবেজ (যেমন- MongoDB বা PostgreSQL) থেকে কুয়েরি করে ডেটা আনা অত্যন্ত ধীরগতির এবং ব্যয়বহুল প্রক্রিয়া হয়ে দাঁড়ায়। এটি এড়াতে এবং এপিআই রেসপন্স টাইম ৫০০ মিলিসেকেন্ড থেকে কমিয়ে সরাসরি সাব-৫ মিলিসেকেন্ডে নামিয়ে আনতে আমরা ব্যবহার করি **Redis Caching**।
রেডিস হলো একটি অত্যন্ত দ্রুতগতির ইন-মেমোরি কি-ভ্যালু (Key-Value) ডাটাবেজ। এটি মূল রিকোয়েস্টটি র্যামের (RAM) ওপর ক্যাশ করে রাখে, ফলে ডিস্ক রিড করার কোনো প্রয়োজন পড়ে না।
১. নোড ডিরেক্টরিতে ক্লায়েন্ট মডিউল ইনস্টলেশন
এক্সপ্রেস অ্যাপে রেডিস ড্রাইভ লিঙ্কিং সেটআপ করার জন্য অফিসিয়াল প্যাকেজটি ইন্সটল করে নিন:
npm install redis express
ধাপ ২: এক্সপ্রেস মিডলওয়্যার ক্যাশিং আর্কিটেকচার
ডাটাবেজ কুয়েরির আগে রেডিস ক্যাশ মেমোরি চেক করা এবং ডেটা না থাকলে তা ডাটাবেজ থেকে এনে ক্যাশে পুশ করার রিয়াল-ওয়ার্ল্ড কোড স্ট্রাকচার:
const express = require('express');
const redis = require('redis');
const app = express();
// রেডিস ক্লায়েন্ট ইনিশিয়েলাইজেশন
const cacheClient = redis.createClient({ url: 'redis://localhost:6379' });
cacheClient.connect().then(() => print("[+] Synchronized with Redis Engine."));
// ক্যাশ ইন্টারসেপ্টর মিডলওয়্যার
async function apiCacheMiddleware(req, res, next) {
const cacheKey = `api_cache:${req.originalUrl}`;
try {
const cachedData = await cacheClient.get(cacheKey);
if (cachedData) {
console.log('[+] Cache Hit! Serving from memory layer.');
return res.json(JSON.parse(cachedData)); // সরাসরি মেমোরি থেকে রেসপন্স রিটার্ন
}
console.log('[-] Cache Miss! Fetching via primary pipeline.');
req.redisKey = cacheKey;
next(); // ক্যাশ না থাকলে মূল এপিআই লজিকে চলে যাবে
} catch (err) {
next();
}
}
// প্রোটেক্টেড এপিআই রাউট
app.get('/api/v1/heavy-products', apiCacheMiddleware, async (req, res) => {
// এখানে আপনার মেইন ডাটাবেজ কুয়েরি লজিক (সিমুলেটেড জেসন ডাটা)
const heavyDatabasePayload = [ { id: 1, name: "Premium Laptop v2" }, { id: 2, name: "Smart Device Grid" } ];
// ৩০০০ সেকেন্ড (৫০ মিনিট) মেয়াদের জন্য রেডিস মেমোরিতে রেজাল্ট ক্যাশ করে রাখা
await cacheClient.setEx(req.redisKey, 3000, JSON.stringify(heavyDatabasePayload));
res.json(heavyDatabasePayload);
});
app.listen(3000, () => console.log('Server engine deployed on port 3000'));
ক্লাউড ইনফ্রাস্ট্রাকচার অপশন: আপনি যদি কোনো সার্ভার কনফিগার না করে সরাসরি ফ্রি ক্লাউড রেডিস ইঞ্জিন ব্যবহার করতে চান, তবে Upstash এর ফ্রি টিয়ার ব্যবহার করতে পারেন, যা সার্ভারলেস এবং REST API এর মাধ্যমেও কানেক্ট করা যায়।