লিখেছেন মেহুল মোহন
রেডিস হল একটি জনপ্রিয় ইন-মেমরি ডেটাবেস যা বিভিন্ন প্রকল্পের জন্য ব্যবহৃত হয়, যেমন ক্যাশিং এবং রেট লিমিটিং৷
এই ব্লগ পোস্টে, আমরা দেখব কিভাবে আপনি রেডিসকে একটি ইন-মেমরি ডাটাবেস হিসাবে ব্যবহার করতে পারেন, কেন আপনি রেডিস ব্যবহার করতে চান এবং অবশেষে আমরা ডাটাবেসের কয়েকটি গুরুত্বপূর্ণ বৈশিষ্ট্য নিয়ে আলোচনা করব। চলুন শুরু করা যাক।
ইন-মেমরি ডাটাবেস কি?
প্রথাগত ডাটাবেসগুলি দ্রুত অ্যাক্সেসের জন্য ডাটাবেসের কিছু অংশ (সাধারণত "হট" বা প্রায়শই অ্যাক্সেস করা সূচক) মেমরিতে রাখে এবং বাকি ডাটাবেস ডিস্কে রাখে।
অন্যদিকে, রেডিস লেটেন্সি এবং ডাটা দ্রুত পুনরুদ্ধার এবং স্টোরেজের উপর অনেক বেশি ফোকাস করে। তাই এটি স্টোরেজ ডিভাইস (SSD/HDD) এর পরিবর্তে মেমরি (RAM) এ সম্পূর্ণভাবে কাজ করে। গতি গুরুত্বপূর্ণ!
Redis হল একটি মূল-মান ডাটাবেস। কিন্তু এটি আপনাকে একটি সাধারণ ডাটাবেস ভেবে বোকা বানাতে দেবেন না। আপনার কাছে সেই কী এবং মানগুলি সংরক্ষণ এবং পুনরুদ্ধার করার অনেক উপায় রয়েছে৷
কেন আপনার Redis দরকার?
আপনি অনেক উপায়ে Redis ব্যবহার করতে পারেন। কিন্তু দুটি প্রধান কারণ আমি ভাবতে পারি:
- আপনি একটি অ্যাপ্লিকেশন তৈরি করছেন যেখানে আপনি আপনার কোড লেয়ারকে স্টেটলেস করতে চান। কেন? - কারণ যদি আপনার কোড স্টেটলেস হয় তবে এটি অনুভূমিকভাবে মাপযোগ্য। অতএব, আপনি একটি কেন্দ্রীয় স্টোরেজ সিস্টেম হিসাবে রেডিস ব্যবহার করতে পারেন এবং আপনার কোডটিকে কেবল যুক্তির সাথে পরিচালনা করতে দিন।
- আপনি এমন একটি অ্যাপ্লিকেশন তৈরি করছেন যেখানে একাধিক অ্যাপের ডেটা ভাগ করতে হতে পারে৷ উদাহরণস্বরূপ, যদি কেউ
payments.codedamn.com-এ আপনার সাইটকে জোরপূর্বক করার চেষ্টা করে তাহলে কী হবে , এবং একবার আপনি এটি সনাক্ত করলে, আপনি তাদেরlogin.codedamn.comএ ব্লক করতে চান ? রেডিস আপনার একাধিক সংযোগ বিচ্ছিন্ন/আস্তিকভাবে সংযুক্ত পরিষেবাগুলিকে একটি সাধারণ মেমরির স্থান ভাগ করতে দেয়৷
রেডিস শেখা তুলনামূলকভাবে সহজ কারণ আপনার জানা দরকার মাত্র কয়েকটি কমান্ড রয়েছে। পরবর্তী কয়েকটি বিভাগে, আমরা কয়েকটি প্রধান Redis ধারণা এবং কিছু দরকারী সাধারণ কমান্ড কভার করব।
The Redis CLI
রেডিসের একটি CLI রয়েছে যা কমান্ড লাইনের একটি REPL সংস্করণ। আপনি যাই লিখুন মূল্যায়ন করা হবে.
উপরের ছবিটি আপনাকে দেখায় কিভাবে একটি সহজ PING করতে হয় অথবা হ্যালো ওয়ার্ল্ড রেডিস-এ আমার কোডডাম রেডিস কোর্স ব্যায়ামগুলির একটিতে (যদি আপনি এটি পরীক্ষা করতে চান তবে কোর্সটি শেষে লিঙ্ক করা আছে)।
এই Redis REPL খুব দরকারী যখন আপনি একটি অ্যাপ্লিকেশনে ডাটাবেসের সাথে কাজ করছেন এবং দ্রুত কিছু কী বা Redis-এর অবস্থার মধ্যে উঁকি দিতে হবে৷
সাধারণ Redis কমান্ড
কোডডাম কোর্সে রেডিস CLI-তে সাধারণ কমান্ডগুলি চেষ্টা করে দেখুন
এটি কীভাবে কাজ করে সে সম্পর্কে আপনাকে আরও জানতে সাহায্য করার জন্য এখানে Redis-এ কিছু খুব সাধারণভাবে ব্যবহৃত কমান্ড রয়েছে:
সেট করুন
SET আপনাকে Redis-এ একটি মানের কী সেট করতে দেয়।
এটি কীভাবে কাজ করে তার একটি উদাহরণ এখানে দেওয়া হল:
SET mehul "developer from india"
এটি mehul কী সেট করে developer from india মান পর্যন্ত .
পান
GET আপনাকে আপনার সেট করা কীগুলি পেতে দেয়৷
এখানে সিনট্যাক্স:
GET mehul
এটি "ভারত থেকে বিকাশকারী" স্ট্রিংটি ফিরিয়ে দেবে যেমনটি আমরা উপরে সেট করেছি।
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 পেয়েছি শূন্য হিসাবে কারণ আমরা এটি কখনই সেট করি না৷
DEL
এই কমান্ডটি একটি কী মুছে দেয় – যথেষ্ট সহজ, তাই না?
এখানে একটি উদাহরণ:
SET key value
GET key # gives you "value"
DEL key
GET key # null
INCR এবং DECR
আপনি এই দুটি কমান্ড ব্যবহার করতে পারেন একটি কী যা একটি সংখ্যা বৃদ্ধি বা হ্রাস করতে। এগুলি খুব দরকারী এবং আপনি সেগুলিকে অনেক বেশি ব্যবহার করবেন, কারণ রেডিস একটিতে দুটি অপারেশন সম্পাদন করতে পারে – GET কী এবং SET কী থেকে কী + 1৷
এটি আপনার অভিভাবক অ্যাপ্লিকেশনে রাউন্ডট্রিপ এড়ায়, এবং লেনদেন ব্যবহার না করেও অপারেশনটিকে নিরাপদ করে তোলে (পরে এই বিষয়ে আরও)
এখানে তারা কিভাবে কাজ করে:
SET favNum 10
INCR favNum # 11
INCR favNum # 12
DECR favNum # 11
মেয়াদ শেষ করুন
EXPIRE কমান্ডটি একটি কীতে মেয়াদ শেষ হওয়ার টাইমার সেট করতে ব্যবহৃত হয়। টেকনিক্যালি এটি একটি টাইমার নয়, কিন্তু একটি কিল টাইমস্ট্যাম্প যার বাইরে কীটি আবার সেট না করা পর্যন্ত সর্বদা শূন্য হবে৷
SET bitcoin 100
EXPIRE bitcoin 10
GET bitcoin # 100
# after 10 seconds
GET bitcoin # null
EXPIRE সামগ্রিকভাবে সেই কীটি সংরক্ষণ করতে একটু বেশি মেমরি ব্যবহার করে (কারণ এখন আপনাকে সেই কীটির মেয়াদ শেষ হওয়ার সময়ও সংরক্ষণ করতে হবে)। কিন্তু আপনি সম্ভবত সেই ওভারহেডের কথা চিন্তা করবেন না।
TTL
এই কমান্ড ব্যবহার করা যেতে পারে শিখতে কী কত সময় বাঁচতে হবে।
উদাহরণ:
SET bitcoin 100
TTL bitcoin # -1
TTL somethingelse # -2
EXPIRE bitcoin 5
# wait 2 seconds
TTL bitcoin # returns 3
# after 1 second
GET bitcoin # null
TTL bitcoin # -2
তাহলে আমরা এই কোড থেকে কি শিখতে পারি?
- TTL
-1ফেরত দেবে যদি কীটি বিদ্যমান থাকে কিন্তু মেয়াদ শেষ না হয় - TTL
-2ফেরত দেবে যদি কীটি বিদ্যমান না থাকে - টিটিএল সেকেন্ডের মধ্যে লাইভ করার সময় ফিরিয়ে দেবে যদি কীটি থাকে এবং মেয়াদ শেষ হয়ে যায়
SETEX
আপনি SET সম্পাদন করতে পারেন৷ এবং EXPIRE একসাথে SETEX .
এই মত:
SETEX key 10 value
এখানে, কী হল "কী", মান হল "মান", এবং লাইভ করার সময় (TTL) হল 10৷ এই কীটি 10 সেকেন্ড পরে আনসেট হয়ে যাবে৷
এখন যেহেতু আপনার মৌলিক Redis কমান্ড এবং CLI কীভাবে কাজ করে সে সম্পর্কে মৌলিক জ্ঞান রয়েছে, আসুন কয়েকটি প্রকল্প তৈরি করি এবং সেই টুলগুলিকে বাস্তব জীবনে ব্যবহার করি৷
প্রকল্প 1 - Redis এর সাথে একটি API ক্যাশিং সিস্টেম তৈরি করুন
কোডডামে API ক্যাশিং সিস্টেম বিল্ডিং ল্যাবের পূর্বরূপ
এই প্রকল্পে Redis এর সাথে একটি API ক্যাশিং সিস্টেম সেট আপ করা জড়িত, যেখানে আপনি একটি 3য় পক্ষের সার্ভার থেকে ফলাফল ক্যাশে করে এবং কিছু সময়ের জন্য এটি ব্যবহার করেন।
এটি দরকারী যাতে আপনি সেই তৃতীয় পক্ষের দ্বারা সীমাবদ্ধ না হন। এছাড়াও, ক্যাশিং আপনার সাইটের গতিকে উন্নত করে, তাই আপনি যদি এটি সঠিকভাবে প্রয়োগ করেন তবে এটি সবার জন্য একটি জয়-জয়৷
আপনি Node.js ব্যবহার করে ব্রাউজারের ভিতরে codedamn-এ ইন্টারেক্টিভভাবে এই প্রকল্পটি তৈরি করতে পারেন। আপনি যদি আগ্রহী হন, আপনি বিনামূল্যে API ক্যাশিং ল্যাব ব্যবহার করে দেখতে পারেন৷
৷আপনি যদি শুধুমাত্র সমাধানে আগ্রহী হন (এবং এটি নিজে তৈরি না করেন) তাহলে এখানে মূল যুক্তি কীভাবে কাজ করবে Node.js:
app.post('/data', async (req, res) => {
const repo = req.body.repo
const value = await redis.get(repo)
if (value) {
// means we got a cache hit
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
})
})
আসুন দেখি এখানে কি হচ্ছে:
- আমরা
repoপাওয়ার চেষ্টা করি (যা পাস করা রেপো ফরম্যাট -facebook/react) আমাদের রেডিস ক্যাশে থেকে। যদি উপস্থিত হয়, মহান! আমরা আমাদের রেডিস ক্যাশে থেকে তারকা গণনা ফেরত দিই, আমাদেরকে গিটহাবের সার্ভারগুলিতে একটি রাউন্ডট্রিপ সংরক্ষণ করে৷ - যদি আমরা এটি ক্যাশে খুঁজে না পাই, আমরা GitHub এর সার্ভারের কাছে একটি অনুরোধ করি এবং তারকা গণনা করি। আমরা পরীক্ষা করি যে তারকা গণনা অনির্ধারিত নয় (যদি একটি রেপো বিদ্যমান না থাকে/ব্যক্তিগত হয়)। যদি এটির একটি মান থাকে, আমরা
setex60 সেকেন্ডের টাইমআউট সহ মান। - আমরা একটি টাইমআউট সেট করি কারণ আমরা সময়ের সাথে বাসি মান পরিবেশন করতে চাই না। এটি আমাদের প্রতি মিনিটে অন্তত একবার আমাদের তারকা গণনা রিফ্রেশ করতে সাহায্য করে৷
এখানে পুরো সোর্স কোড আছে:
প্রকল্প 2 - Redis-এর সাথে রেট লিমিটিং API
Redis এর সাথে রেট লিমিটিং API এর পূর্বরূপ
এই প্রজেক্টে একটি নির্দিষ্ট শেষ পয়েন্টকে খারাপ অভিনেতাদের থেকে রক্ষা করার জন্য হার সীমিত করা এবং তারপর সেই নির্দিষ্ট API অ্যাক্সেস করা থেকে তাদের ব্লক করা জড়িত।
এটি লগইন এবং সংবেদনশীল API এন্ডপয়েন্টের জন্য খুবই উপযোগী, যেখানে আপনি হাজার হাজার অনুরোধের সাথে একজন ব্যক্তিকে আপনার এন্ডপয়েন্টে আঘাত করতে চান না।
আমরা এই ল্যাবে IP ঠিকানা দ্বারা হার সীমিত সঞ্চালন. আপনি যদি এই কোডল্যাবটি চেষ্টা করতে চান তবে আপনি এটিকে কোডডামে বিনামূল্যে চেষ্টা করতে পারেন৷
৷আপনি যদি শুধুমাত্র সমাধানে আগ্রহী হন (এবং এটি নিজে তৈরি না করেন) তাহলে এখানে মূল যুক্তি কীভাবে কাজ করবে Node.js:
app.post('/api/route', async (req, res) => {
// add data here
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ব্যবহার করতে পারেন যেমন আমরা এক্সপ্রেস ব্যবহার করছি) - আমরা
INCRআইপি ঠিকানা ক্ষেত্র। যদি Redis-এ আমাদের কী কখনও বিদ্যমান না থাকে, তাহলে INCR স্বয়ংক্রিয়ভাবে এটিকে 0-এ সেট করবে এবং বৃদ্ধি পাবে, যা শেষ পর্যন্ত 1-এ সেট করা হবে। - আমরা 2 সেকেন্ডের মধ্যে মেয়াদ শেষ হওয়ার জন্য কী সেট করেছি। আদর্শভাবে আপনি একটি বৃহত্তর মান চান - কিন্তু এটিই উপরে উল্লেখিত কোডডাম চ্যালেঞ্জ, তাই আমাদের কাছে এটি রয়েছে৷
- অবশেষে আমরা অনুরোধের সংখ্যা পরীক্ষা করি, যদি সেগুলি একটি নির্দিষ্ট থ্রেশহোল্ডের চেয়ে বেশি হয়, আমরা অনুরোধটিকে মূল ফাংশন বডিতে পৌঁছাতে বাধা দিই৷
এখানে সম্পূর্ণ সমাধান:
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 এর পরে কিছু চালান , এবং এটি EXEC দেখার মুহূর্তে সবকিছু চালাবে কীওয়ার্ড।
Redis আরও উন্নত ব্যবহারের ক্ষেত্রে তালিকা এবং সেটগুলির জন্য সমর্থন অন্তর্ভুক্ত করে। আপনি Redis একটি সম্প্রচার পরিষেবা হিসাবে ব্যবহার করতে পারেন যেখানে আপনি প্রকাশ করেন৷ একটি চ্যানেলে এবং অন্য যারা সাবস্ক্রাইব করেছেন চ্যানেলে একটি বিজ্ঞপ্তি পাবেন। মাল্টি-ক্লায়েন্ট আর্কিটেকচারে এটি খুবই উপযোগী।
উপসংহার
আমি আশা করি আপনি Redis এই ভূমিকা পছন্দ করেছেন. এই ব্লগ পোস্টটি কোডডামের নতুন ইন্টারেক্টিভ কোর্সের একটি অংশ:Redis + Node.js ক্যাশিং, যেখানে আপনি কেবল এই ধারণাগুলি সম্পর্কেই শিখবেন না, তবে যেতে যেতে আপনার ব্রাউজারে তাদের অনুশীলন করুন৷
কোর্সটি একবার চেষ্টা করে দেখতে নির্দ্বিধায় এবং আপনি কি মনে করেন তা আমাকে জানান। যেকোনো প্রতিক্রিয়া পাঠাতে আপনি আমাকে টুইটারে খুঁজে পেতে পারেন :)
বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন