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

Redis আয়ত্ত করুন: CLI এসেনশিয়ালস, কি কমান্ড, এবং প্র্যাকটিক্যাল প্রজেক্ট

লেখক: Mehul Mohan

Redis একটি জনপ্রিয় ইন-মেমরি ডাটাবেস যা বিভিন্ন প্রজেক্টে ব্যবহৃত হয়, যেন ক্যাশিং এবং রেট লিমিটিং।

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

ইন-মেমরি ডাটাবেস কী?

প্রথাগত ডাটাবেসগুলো ডাটাবেসের একটি অংশ (সাধারণত "হট" বা প্রায়শই অ্যাক্সেস করা ইন্ডেক্সগুলো) মেমরিতে রাখে দ্রুত অ্যাক্সেসের জন্য, এবং ডাটাবেসের বাকি অংশ ডিস্কে থাকে।

অন্যদিকে, Redis ল্যাটেন্সি এবং ডেটার দ্রুত রিট্রিভাল ও স্টোরেজের ওপর ফোকাস করে। তাই এটি পুরোপুরি মেমরি (RAM) তে অপারেট করে স্টোরেজ ডিভাইস (SSD/HDD) না ব্যবহার করে। স্পিড গুরুত্বপূর্ণ!

Redis একটি কি-ভ্যালু ডাটাবেস। কিন্তু এটিকে একটি সিম্পল ডাটাবেস বলে ভুলবেন না। আপনার पास उन কি এবং ভ্যালুগুলো সংরক্ষণ ও রিট্রিভ করার অনেক উপায় রয়েছে।

আপনাকে Redis কেন দরকার?

আপনি Redis অনেকভাবে ব্যবহার করতে পারেন। কিন্তু দুটি প্রধান কারণ আমি চিন্তা করতে পারি:

  1. আপনি এমন একটি অ্যাপ্লিকেশন তৈরি করছেন যেখানে আপনি আপনার কোড লেয়ারকে স্টেটলেস বানাতে চান। কেন? – কারণ আপনার কোড যদি স্টেটলেস হয়, এটি হরিজেন্টালি স্কেলেবল। তাই আপনি Redis কে একটি সেন্ট্রাল স্টোরেজ সিস্টেম হিসেবে ব্যবহার করতে পারেন এবং আপনার কোডকে শুধু লজিক হ্যান্ডল করতে দিতে পারেন।
  2. আপনি এমন একটি অ্যাপ্লিকেশন তৈরি করছেন যেখানে একাধিক অ্যাপ ডেটা শেয়ার করতে পারে। উদাহরণস্বরূপ, কেউ যদি আপনার সাইট payments.codedamn.com-এ ব্রুটফোর্স করার চেষ্টা করে, এবং একবার আপনি এটি ডিটেক্ট করলে, আপনি চাইবেন সেটিকে login.codedamn.com-এও ব্লক করা। Redis আপনার একাধিক ডিসকানেক্টেড/লুজলি কানেক্টেড সার্ভিসগুলোর একটি কমন মেমরি স্পেস শেয়ার করতে দেয়।

Redis শিখতে তুলনামূলকভাবে সহজ কারণ শুধু কিছু কমান্ড জানতে হয়। পরের কয়েকটি সেকশনে, আমরা কিছু প্রধান Redis কনসেপ্ট এবং কিছু উপযোগী কমন কমান্ড কভার করব।

Redis CLI

codedamn Redis কোর্স এক্সারসাইজে Redis CLI-এ সিম্পল PING বা হ্যালো ওয়ার্ল্ড

Redis-র একটি CLI আছে যা কমান্ড লাইনের একটি REPL ভার্সন। আপনি যা লিখবেন সেটি ইভ্যালুয়েট হবে।

উপরের ছবিটি আপনাকে দেখায় কীভাবে Redis-এ একটি সিম্পল PING বা হ্যালো ওয়ার্ল্ড করবেন আমার codedamn Redis কোর্স এক্সারসাইজে (কোর্সটি শেষে লিংক করা আছে যদি আপনি চেক করতে চান)।

এই Redis REPL খুব উপকারী যখন আপনি ডাটাবেসে অ্যাপ্লিকেশনে কাজ করছেন এবং দ্রুত কিছু কি বা Redis-এর স্টেট চেক করতে চান।

সাধারণ Redis কমান্ডসমূহ

codedamn কোর্সে Redis CLI-এ কমন কমান্ডগুলো ট্রাই করা

Redis-এ কিছু খুব কমনলি ইউজড কমান্ড যা আপনাকে আরও জানতে সাহায্য করবে কীভাবে এটি কাজ করে:

SET

SET আপনাকে Redis-এ একটি কি একটি ভ্যালুতে সেট করতে দেয়।

এখানে একটি উদাহরণ কীভাবে এটি কাজ করে:

SET mehul "developer from india"

এটি mehul কিকে developer from india ভ্যালুতে সেট করে।

GET

GET আপনাকে আপনার সেট করা কিগুলো পেতে দেয়।

সিনট্যাক্সটি এখানে:

GET mehul

এটি স্ট্রিং "developer from india" রিটার্ন করবে যেটি আমরা উপরে সেট করেছিলাম।

SETNX

এই কি শুধু তখন একটি ভ্যালু সেট করবে যখন কিটি অস্তিত্বে নেই। এই কমান্ডের অনেক ইউজ কেস রয়েছে, যার মধ্যে আছে অকস্মাত একটি কির ভ্যালু ওভাররাইট না করা যেটি ইতিমধ্যে উপস্থিত হতে পারে।

এখানে কীভাবে এটি কাজ করে:

SET key1 value1
SETNX key1 value2
SETNX key2 value2

এই উদাহরণ চালানোর পর, আপনার key1-এর ভ্যালু থাকবে value1 এবং key2-র value2। কারণ দ্বিতীয় কমান্ডটি কোনো ইফেক্ট ফেলবে না যেহেতু key1 ইতিমধ্যে উপস্থিত ছিল।

MSET

MSET SET-এর মতো, কিন্তু আপনি এক কমান্ডে একাধিক কি সেট করতে পারেন। কীভাবে এটি কাজ করে:

MSET key1 "value1" key2 "value2" key3 "value3"

এখন আমরা key এবং value প্রিফিক্স হিসেবে ব্যবহার করছি কি এবং ভ্যালুর জন্য। কিন্তু বাস্তবে যখন আপনি এত লম্বা কমান্ড লিখেন, কি কী এবং ভ্যালু কী সেটি ট্র্যাক রাখা সহজ নয়।

তাই একটা জিনিস করতে পারেন – সবসময় আপনার ভ্যালু ডবল কোটেশনে কোট করুন, এবং কিগুলো কোটেশন ছাড়া রাখুন (যদি সেগুলো কোটেশন ছাড়া ভ্যালিড কিনেম থাকে)।

MGET

MGET GET-এর মতো, কিন্তু এটি একসাথে একাধিক ভ্যালু রিটার্ন করতে পারে, এইভাবে:

MGET key1 key2 key3 key4

এটি চারটি ভ্যালু এক অ্যারে হিসেবে রিটার্ন করবে: value1, value2, value3 এবং null। আমরা key4 নিয়েছি null কারণ আমরা সেটি কখনো সেট করিনি।

DEL

এই কমান্ড একটি কি ডিলিট করে – সিম্পল যেন?

এখানে একটি উদাহরণ:

SET key value
GET key # আপনাকে "value" দেবে
DEL key
GET key # null

INCR এবং DECR

আপনি এই দুটি কমান্ড ব্যবহার করতে পারেন একটি কি ইনক্রিমেন্ট বা ডিক্রিমেন্ট করতে যেটি একটি নম্বর। এগুলো খুব উপকারী এবং আপনি এগুলো অনেক ব্যবহার করবেন, কারণ Redis দুটি অপারেশন একসাথে পারফর্ম করতে পারে – GET key এবং SET key to key + 1।

এটি আপনার প্যারেন্ট অ্যাপ্লিকেশনের সাথে রাউন্ডট্রিপ এড়িয়ে দেয়, এবং অপারেশনটিকে ট্রানজ্যাকশন ছাড়া সেফলি পারফর্ম করতে সক্ষম করে (এর Commodities পরে)

এখানে কীভাবে এগুলো কাজ করে:

SET favNum 10
INCR favNum # 11
INCR favNum # 12
DECR favNum # 11

EXPIRE

EXPIRE কমান্ড একটি কির এক্সপায়ারেশন টাইমার সেট করতে ব্যবহৃত হয়। টেকনিক্যালি এটি একটি টাইমার নয়, বরং একটি কিল টাইমস্ট্যাম্প যার পরে কিটি সবসময় null রিটার্ন করবে যদি না আবার সেট করা হয়।

SET bitcoin 100
EXPIRE bitcoin 10
GET bitcoin # 100
# ১০ সেকেন্ড পর
GET bitcoin # null

EXPIRE কিছু এক্সট্রা মেমরি ব্যবহার করে সেই কি পুরোটা সংরক্ষণ করার জন্য (কারণ এখন আপনাকে সেটও সংরক্ষণ করতে হয় কিটি কখন এক্সপایر হবে)। কিন্তু আপনি সম্ভবত কখনো সেই ওভারহেডের কwohner করবেন না।

TTL

এই কমান্ড ব্যবহার করা যায় কিটি কতক্ষণ লিভ করতে পারে সেটি জানতে।

উদাহরণ:

SET bitcoin 100
TTL bitcoin # -1
TTL somethingelse # -2
EXPIRE bitcoin 5
# ২ সেকেন্ড অপেক্ষা করুন
TTL bitcoin # রিটার্ন করে ৩
# ১ সেকেন্ড পর
GET bitcoin # null
TTL bitcoin # -2

এই কোড থেকে আমরা কী শিখতে পারি?

  1. TTL -1 রিটার্ন করবে যদি কিটি অস্তিত্বে থাকে কিন্তু এক্সপায়ারেশন নেই
  2. TTL -2 রিটার্ন করবে যদি কিটি অস্তিত্বে না থাকে
  3. TTL সেকেন্ডে টাইম টু লিভ রিটার্ন করবে যদি কিটি অস্তিত্বে থাকে এবং এক্সপायर হবে

SETEX

আপনি SET এবং EXPIRE একসাথে পারফর্ম করতে পারেন SETEX দিয়ে।

এভাবে:

SETEX key 10 value

এখানে, কি হলো "key", ভ্যালু হলো "value", এবং টাইম টু লিভ (TTL) হলো ১০। এই কি ১০ সেকেন্ড পর আনসেট হয়ে যাবে।

এখন যেহেতু আপনার বেসিক Redis কমান্ড এবং CLI কীভাবে কাজ করে সেটি ফান্ডামেন্টাল নলেজ আছে, আসুন কয়েকটি প্রজেক্ট বানাই এবং রিয়েল লাইফে সেই টুলগুলো ব্যবহার করি।

প্রজেক্ট ১ – Redis দিয়ে একটি API ক্যাশিং সিস্টেম বানান

codedamn-এ API ক্যাশিং সিস্টেম বিল্ডিং ল্যাবের প্রিভিউ

এই প্রজেক্টটি Redis দিয়ে একটি API ক্যাশিং সিস্টেম সেট আপ করার সাথে জড়িত, যেখানে আপনি একটি থার্ড পার্টি সার্ভার থেকে রেজাল্ট ক্যাশ করবেন এবং কিছু সময় এর জন্য ব্যবহার করবেন।

এটি উপযোগী যাতে আপনি সেই থার্ড পার্টি দ্বারা রেট লিমিটেড না হন। এছাড়া, ক্যাশিং আপনার সাইটের স্পিড উন্নত করে, তাই আপনি যদি সঠিকভাবে ইমপ্লিমেন্ট করেন তবে সবার জন্য এটা উইন-উইন।

আপনি এই প্রজেক্টটি codedamn-এ ব্রাউজারের মধ্যে ইন্টারঅ্যাক্টিভলি Node.js ব্যবহার করে বানাতে পারেন। আপনি যদি আগ্রহী হন, API ক্যাশিং ল্যাবটি বিনামূল্যে ট্রাই করতে পারেন।

আপনি যদি শুধু সমাধানটি জানতে চান (নাকি নিজে বানাতে) তবে এখানে কোর লজিক Node.js-এ কীভাবে কাজ করবে:

app.post('/data', async (req, res) => {
    const repo = req.body.repo
    const value = await redis.get(repo)
    if (value) {
        // মানে আমরা একটি ক্যাশ হিট পেলাম
        res.json({ status: 'ok', stars: value })
        return
    }
    const response = await fetch(`https://api.github.com/repos/${repo}`).then((t) => t.json())
    if (response.stargazers_count != undefined) {
        await redis.setex(repo, 60, response.stargazers_count)
    }
    res.json({ status: 'ok', stars: response.stargazers_count })
})

দেখি কী হচ্ছে এখানে:

  • আমরা আমাদের Redis ক্যাশ থেকে repo (যেটি পাস করা রিপো ফরম্যাট – facebook/react) পেতে চেষ্টা করি। যদি উপস্থিত থাকে, গ্রেট! আমরা আমাদের redis ক্যাশ থেকে স্টার কাউন্ট রিটার্ন করি, GitHub-এর সার্ভারগুলোতে একটি রাউন্ডট্রিপ বাঁচিয়ে।
  • আমরা যদি ক্যাশে না পাই, আমরা GitHub-এর সার্ভারগুলোর একটি রিকোয়েস্ট করি, এবং স্টার কাউন্ট পাই। আমরা চেক করি স্টার কাউন্ট undefined নয় কিনা (কেসে একটি রিপো এক্সিস্ট না করে/প্রাইভেট)। যদি এর ভ্যালু থাকে, আমরা ৬০ সেকেন্ড টাইমআউটের সাথে ভ্যালুটি setex করি।
  • আমরা একটি টাইমআউট সেট করি কারণ আমরা সময়ের সাথে পুরানো ভ্যালু সার্ভ করতে চাই না। এটি আমাদের কমপক্ষে একবার প্রতি মিনিটে স্টার কাউন্ট রিফ্রেশ করতে সাহায্য করে।

এখানে পূর্ণ সোর্স কোড:

প্রজেক্ট ২ - Redis দিয়ে API রেট লিমিটিং

Redis দিয়ে রেট লিমিটিং API-এর প্রিভিউ

এই প্রজেক্টটি একটি নির্দিষ্ট এন্ডপয়েন্ট রেট লিমিট করার সাথে জড়িত যাতে ব adina actores থেকে সুরক্ষা করা যায়, এবং তারপর তাদের সেটি অ্যাক্সেস করতে ব্লক করা।

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

আমরা এই ল্যাবে IP অ্যাড্রেস দিয়ে রেট লিমিটিং পারফর্ম করি। আপনি যদি এই কোডল্যাব অ্যাটেম্প্ট করতে চান, codedamn-এ বিনামূল্যে ট্রাই করতে পারেন।

আপনি যদি শুধু সমাধান জানতে চান (নাকি নিজে বানাতে) তবে এখানে কোর লজিক Node.js-এ কীভাবে কাজ করবে:

app.post('/api/route', async (req, res) => {
    // ডেটা এখানে যোগ করুন
    const ip = req.headers['x-forwarded-for'] || req.ip
    const reqs = await redis.incr(ip)
    await redis.expire(ip, 2)
    if (reqs > 15) {
        return res.json({ status: 'rate-limited' })
    } else if (reqs > 10) {
        return res.json({ status: 'about-to-rate-limit' })
    } else {
        res.json({ status: 'ok' })
    }
})

এই কোড ব্লক বুঝি:

  • আমরা x-forwarded-for হেডার থেকে IP এক্সট্রাক্ট করার চেষ্টা করি (অথবা আপনি req.ip ব্যবহার করতে পারেন যেহেতু আমরা express ব্যবহার করছি)
  • আমরা IP অ্যাড্রেস ফিল্ড INCR করি। যদি আমাদের Redis-এ কিটি কখনো অস্তিত্বে না থাকে, INCR অটোমেটিক্যালি এটিকে ০ সেট করবে এবং ইনক্রিমেন্ট করবে, অর্থাৎ চূড়ান্তভাবে এটিকে ১ সেট করবে।
  • আমরা কিকে ২ সেকেন্ডে এক্সপায়ার সেট করি। আদর্শভাবে আপনি একটি বড় ভ্যালু চান – কিন্তু এটি codedamn চ্যালেঞ্জের স্পেসিফিকেশন ছিল, তাই সেটি আছে।
  • শেষে আমরা রিকোয়েস্ট কাউন্ট চেক করি, যদি সেগুলো একটি নির্দিষ্ট থ্রেশহোল্ড থেকে বেশি হয়, আমরা রিকোয়েস্টটি মেইন ফাংশন বডিতে পৌঁছাতে ব্লক করি।

এখানে পূর্ণ সমাধান:

Redis সম্পর্কে আরও

Redis আমরা যা শিখেছি তার চেয়ে অনেক বেশি। কিন্তু ভালো খবর হলো আমরা ইতিমধ্যে পর্যাপ্ত শিখেছি যাতে এটির সাথে কাজ শুরু করতে পারি!

এই সেকশনে, Redis-এর কিছু আরও ফান্ডামেন্টাল কভার করি।

Redis সিঙ্গল থ্রেডেড

Redis একটি সিঙ্গল থ্রেডেড প্রসেস হিসেবে রান করে, এমনকি একটি মাল্টিপল কোর সিস্টেমে যা মাল্টি থ্রেডিং সাপোর্ট করে। এটি একটি পারফরম্যান্স নাইটমেয়ার নয়, বরং একটি সেফটি মেজার মাল্টি থ্রেডেড এনভায়রনমেন্টে ইনকনসিস্টেন্ট রিড/রাইটের বিরুদ্ধে।

যদি Redis মাল্টি থ্রেডেড হতো, একটি সিঙ্গল কি অ্যাক্সেস করার সময় থ্রেড সেফটি নিশ্চিত করতে, আপনি চূড়ান্তভাবে কিছু লকিং মেকানিজমে রেজল্ভ করতেন, যেটি সম্ভবত সিঙ্গল থ্রেডেড/সিকোয়েনশিয়াল অ্যাক্সেসের চেয়ে ওরস পারফর্ম করত।

Redis ট্রানজ্যাকশন

নিশ্চিতভাবেই, আপনি Redis-এ সব কিছু একটি সিঙ্গল কমান্ডে করতে পারবেন না। কিন্তু আপনি নিশ্চিতভাবেই এটিকে বলতে পারেন একটি ব্লক কমান্ড একসাথে করতে (অর্থাৎ, কেউ অন্য Redis-র সাথে কথা বলবে না যতক্ষণ না সেটি সেই ব্লক এক্সিকিউট করছে)। আপনি এটি MULTI কমান্ড ব্যবহার করে করতে পারেন।

এখানে কীভাবে এটি কাজ করে:

MULTI
SET hello world
SET yo lo
SET number 1
INCR number
EXPIRE hello 10
EXPIRE yo 5
EXEC

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

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

উপসংহার

আশা করি Redis-এ এই পরিচিতিটি আপনাকে পছন্দ এসেছে। এই ব্লগ পোস্ট codedamn-এর নতুন ইন্টারঅ্যাক্টিভ কোর্সের অংশ: Redis + Node.js ক্যাশিং, যেখানে আপনি শুধু এই কনসেপ্টগুলো শিখবেন না, বরং আপনার ব্রাউজারে অন-দ-গো প্র্যাকটিস করবেন।

বিনামূল্যে কোর্সটি ট্রাই করতে আপনি স্বাধীন এবং আপনার মতামত জানাতে পারেন। আপনি আমাকে টুইটারে ফিন্ড করতে পারেন যেকোনো ফিডব্যাক পাঠাতে :)

  1. .NET Core 6-এ রেডিস ক্যাশিং দিয়ে পারফরম্যান্স বাড়ান: ধাপে ধাপে গাইড

  2. HTML DOM Input Time type প্রপার্টি

  3. C ভাষায় মার্জ সোর্ট (Merge Sort) টেকনিক ব্যাখ্যা

  4. জাভাস্ক্রিপ্টে Array.prototype.flat() মেথড