SYSTEM DESIGN

Caching Strategies (Redis)

Definition: Caching is the process of storing copies of files or data in a temporary storage location (like RAM) so that they can be accessed more quickly.

সাধারণ ইউজার ট্রাফিকে ডাটাবেস পারফেক্ট কাজ করে। কিন্তু যখন রিকোয়েস্টের পরিমাণ বিশাল হয়, তখন ডাটাবেসকে অতিরিক্ত লোড থেকে বাঁচাতে এবং রেসপন্স টাইম মিলি-সেকেন্ডে নামিয়ে আনতে আমরা Caching আর্কিটেকচার ব্যবহার করি।

1. Cache Hit vs Cache Miss

The Black Friday Crash

ধরি, আপনার ই-কমার্স সাইটে "Black Friday" সেল চলছে। এক সেকেন্ডে ১০,০০০ ইউজার হোমপেজে ভিজিট করলো। যদি আপনার Node.js সার্ভার এই ১০,০০০ বারের প্রতিবারই MongoDB বা PostgreSQL-এ গিয়ে "টপ প্রোডাক্ট" এর কোয়েরি (Query) রান করে, তবে আপনার ডাটাবেস নিশ্চিত ক্র্যাশ করবে!

The Redis Solution: এর প্রো-সলিউশন হলো In-Memory Cache (Redis)। প্রথম ইউজার যখন ভিজিট করবে, সার্ভার ডাটাবেস থেকে ডেটা এনে RAM (Redis) এ সেভ করে রাখবে (যাকে বলে Cache Miss)। এরপর বাকি ৯,৯৯৯ জন ইউজারকে ডাটাবেস পর্যন্ত যেতেই হবে না! সার্ভার চোখের পলকে RAM থেকে ডেটা তুলে তাদেরকে দিয়ে দিবে (যাকে বলে Cache Hit)। এতে ডাটাবেস বেঁচে যাবে এবং রেসপন্স টাইম ১০০ গুণ ফাস্ট হবে!

Cache Miss (Slow)

রিকোয়েস্ট করা ডেটা ক্যাশে (RAM) পাওয়া যায়নি। সার্ভারকে এখন মূল ডাটাবেসে যেতে হবে, ডেটা প্রসেস করতে হবে, ক্লায়েন্টকে পাঠাতে হবে এবং ভবিষ্যতের জন্য ক্যাশে একটি কপি সেভ করতে হবে। (সময় বেশি লাগে)

Cache Hit (Lightning Fast)

রিকোয়েস্ট করা ডেটা ক্যাশে আগে থেকেই রেডি করা আছে। সার্ভার মূল ডাটাবেসকে পুরোপুরি বাইপাস (Bypass) করে সরাসরি RAM থেকে ডেটা রিটার্ন করে দেয়। (মিলিসেকেন্ডে কাজ শেষ)

2. Node.js + Redis Implementation

একটি প্রোডাকশন-গ্রেড ক্যাশিং আর্কিটেকচার ঠিক এভাবেই কাজ করে: প্রথমে ক্যাশ চেক করো। ডেটা থাকলে সাথে সাথে রিটার্ন করো। না থাকলে DB থেকে আনো, সেটিকে একটি TTL (Time-To-Live) দিয়ে ক্যাশে রাখো, তারপর রিটার্ন করো।

controllers/productController.js
const redisClient = require('../config/redis');
const Product = require('../models/Product');

exports.getTrendingProducts = async (req, res) => {
    const cacheKey = 'products:trending';

    // 1. Check Redis Cache Memory first
    const cachedData = await redisClient.get(cacheKey);
    
    if (cachedData) {
        // Cache HIT: Bypass Database & return immediately
        return res.status(200).json(JSON.parse(cachedData));
    }

    // 2. Cache MISS: Query heavy data from MongoDB
    const products = await Product.find().sort({ views: -1 }).limit(10);

    // 3. Save to Redis with 1-hour expiration (3600 seconds)
    await redisClient.setEx(cacheKey, 3600, JSON.stringify(products));

    res.status(200).json(products);
};

3. Latency Difference Simulator

RAM বনাম হার্ড-ড্রাইভের স্পিডের পার্থক্য বাস্তবে অনুভব করুন। "Fetch Data" বাটনে ক্লিক করুন। প্রথম রিকোয়েস্টটি ডাটাবেস থেকে আসতে সময় নেবে (Cache Miss)। কিন্তু দ্বিতীয়বার ক্লিক করলেই ডেটা চোখের পলকে Redis থেকে সার্ভ হবে (Cache Hit)!

Cache Memory is currently Empty.

Server Response Time
000ms

Awaiting Client Request...