Redis একটি ডেটা স্টোর যা ডেটা প্রধানত মেমরিতে সংরক্ষণ করে। এটি প্রথাগত ডাটাবেসের চেয়ে দ্রুত এবং খুব জনপ্রিয় হয়ে উঠেছে।
Redis কী?
Redis একটি ডেটা স্টোর – একটি ডাটাবেসের মতো, কিন্তু এটি ডেটা প্রাথমিকভাবে ইন-মেমরিতে সংরক্ষণ করে। এটি প্রথাগত ডাটাবেসের চেয়ে অনেক দ্রুত যেখানে ডেটা ডিস্কে সংরক্ষিত থাকে। এই গতির কারণে, Redis প্রায়শই একটি ক্যাশিং টুল হিসেবে ব্যবহৃত হয়।
Redis যেকোনো ডেটা টাইপে ডেটা সংরক্ষণ করতে পারে, কারণ এটি কি-ভ্যালু পেয়ার সিস্টেম ব্যবহার করে ডেটা সংরক্ষণ করতে। এটি প্রথাগত ডাটাবেস থেকে আলাদা যা ডকুমেন্ট বা রো ব্যবহার করে।
আপনি একটি Redis ডাটাবেসকে একটি বড় JSON অবজেক্ট হিসেবে ভাবতে পারেন, যেখানে ডাটাবেসের সব কিছু একটি কি-ভ্যালু পেয়ার। এর মানে এটি কাঠামোবদ্ধ ডেটা সংরক্ষণের জন্য সেরা জায়গা নাও হতে পারে।
আপনি Redis কে একটি ডাটাবেস হিসেবেও ব্যবহার করতে পারেন, কারণ এর ডেটা ডিস্কে লিখে 지속যোগ্যতা (persistence) নিশ্চিত করার ক্ষমতা রয়েছে। আপনি Redis কে কনফিগার করতে পারেন যাতে ডেটা পর্যায়ক্রমে বা প্রতিটি কমান্ড ইস্যু করার পর সংরক্ষিত হয়। যখন Redis ডেটা সংরক্ষণের জন্য কনফিগার করা হয় না, তখন এটি খুব চঞ্চল, এবং একটি সিস্টেম ক্র্যাশ ডেটা ক্ষতির কারণ হবে।
Redis প্রোডাকশন-লেভেল অ্যাপ্লিকেশনে জনপ্রিয় এবং এটি টুইটার, গিটহাব, স্ন্যাপচ্যাট এবং স্ট্যাকওভারফ্লো বড় কোম্পানিগুলো দ্বারা ব্যবহৃত হয়।
Redis-এর সাধারণ ব্যবহার ক্ষেত্রসমূহ
- वन-টাইম পাসওয়ার্ড (OTP) এর জন্য: এগুলো সাধারণত একবার ব্যবহার করার জন্য তৈরি হয় এবং সংক্ষিপ্ত عمر থাকে। Redis-এর ডেটার জন্য এক্সপায়ারি তারিখ সেট করার ক্ষমতার সাথে, আপনি নির্দিষ্ট সময়ের পর সেগুলো মুছে ফেলার চিন্তা ছাড়াই OTP নিরাপদে সংরক্ষণ করতে পারেন।
- বারবার অ্যাক্সেস করা রিসোর্সের জন্য: এমন ডেটা যা প্রায়শই অ্যাক্সেস করা হয় কিন্তু অনেক পরিবর্তন হয় না, সেগুলোর জন্য Redis ব্যবহার করে আপনি ডাটাবেস কোয়েরি বা এক্সটার্নাল সার্ভিস কল করার সময় বাঁচাতে পারেন।
- ভারী ডাটাবেস কোয়েরির জন্য: যেসব ডাটাবেস কোয়েরি সময় নেয় এবং প্রায়শই পরিবর্তন হয় না, তাদের ফলাফল Redis-এ আপনার ইচ্ছামতো długo সংরক্ষণ করে সেই সময় কমাতে পারেন।
Redis কীভাবে ইনস্টল করবেন
আপনি যেকোনো অপারেটিং সিস্টেমে Redis ইনস্টল করতে পারেন। এখানে macOS, Windows Subsystem for Linux এবং Linux-এর জন্য নির্দেশাবলী দেওয়া হলো।
macOS
macOS-এ Redis ইনস্টল করতে, চালান:
brew install redis
তারপর Redis শুরু করতে এই কমান্ডটি চালান:
redis-server
Windows Subsystem for Linux এবং Linux
Redis এখনো উইন্ডোজ অপারেটিং সিস্টেমকে সরাসরি সাপোর্ট করে না, তাই উইন্ডোজে WSL (Windows Subsystem for Linux) ইনস্টল করে আপনি একটি লিনাক্স পরিবেশ পেতে পারেন।
লিনাক্সে Redis ইনস্টল করতে, চালান:
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
তারপর Redis শুরু করতে এই কমান্ডটি চালান:
sudo service redis-server start
এখন Redis ইনস্টল হয়ে গেলে, আপনি redis-cli ping চালিয়ে এটি পরীক্ষা করতে পারেন। এটি "PONG" আউটপুট দেবে।
Redis-এর মৌলিক কমান্ডসমূহ
Redis কে REPL বা স্বতন্ত্র অ্যাপ্লিকেশন হিসেবে ব্যবহার করতে, redis-cli চালান। এটি REPL পরিবেশ খুলবে।
ডেটা সেট করা
Redis-এ একটি কি-ভ্যালু পেয়ার সেট করতে SET কিওয়ার্ড ব্যবহার করুন। username কিকে Zubs ভ্যালুতে সেট করতে, চালান:
SET username Zubs
ডেটা পেতে
অবশেষে সংরক্ষিত username কি পেতে, GET কিওয়ার্ড ব্যবহার করুন:
GET username
ডেটা মুছে ফেলা
আপনি পূর্বে সংরক্ষিত একটি কি মুছে ফেলতে DEL কিওয়ার্ড ব্যবহার করতে পারেন:
DEL username
একটি ভ্যালু আছে কিনা চেক করা
আপনি EXISTS কিওয়ার্ড ব্যবহার করে একটি কির অস্তিত্ব চেক করতে পারেন। কি না থাকলে এটি 0 রিটার্ন করে, এবং থাকলে 1। সম্প্রতি মুছে ফেলা username কি আছে কিনা চেক করে পরীক্ষা করুন।
কি-গুলোর জন্য Time to Live (TTL) সেট করা
Redis আপনাকে নির্দিষ্ট করার দেয় কোনো কি কতক্ষণ থাকবে। এটি Redis-এর একটি দুর্দান্ত বৈশিষ্ট্য। এটি করতে SETEX কিওয়ার্ড ব্যবহার করুন:
SETEX key seconds value
আপনি TTL কিওয়ার্ড ব্যবহার করে একটি নির্দিষ্ট কির টাইম টু লিভ চেক করতে পারেন। এটি -1 রিটার্ন করে যদি কিতে কোনো এক্সপায়ারেশন সেট না থাকে, অর্থাৎ এটি অনিশ্চিতকাল ধরে রাখা হবে। এটি -2 রিটার্ন করে যদি কি থাক না। এবং কি থাকলে সেকেন্ডে সময় রিটার্ন করে।
আপনি EXPIRE কিওয়ার্ড ব্যবহার করে পূর্বে তৈরি একটি কির জন্য (যার এক্সপায়ারেশন ছিল না) সেকেন্ডে এক্সপায়ারেশন সময় সেট করতে পারেন। উদাহরণস্বরূপ, age ভেরিয়েবল সংরক্ষণ করার জন্য একটি কি তৈরি করুন যার ভ্যালু 26।
SET age 26
তারপর এর জন্য ১০ সেকেন্ডের এক্সপায়ারেশন সময় সেট করুন।
EXPIRE age 20
বারবার টাইম লেফট টু লিভ চেক করে দেখুন কীভাবে এটি কমে যায় এবং 最終ত আর অস্তিত্বে থাকে না।
Redis দিয়ে একটি সাধারণ অ্যাপ্লিকেশন তৈরি করা
Redis কীভাবে কাজ করে বুঝতে সাহায্য করার জন্য, আমরা এখন একটি বেসিক ওয়েব অ্যাপ্লিকেশন তৈরি করব যা ডেটা ক্যাশ করার জন্য Redis ব্যবহার করে যাতে রেসপন্স দ্রুত লোড হয়। আপনি একটি সাধারণ অ্যাপ্লিকেশন তৈরি করবেন যা JSONPlaceholder থেকে ছবির ডেটা ফেচ করে এবং রিটার্ন করে।
Composer ব্যবহার করে একটি নতুন PHP প্রজেক্ট তৈরি করা
প্রজেক্টের জন্য একটি নতুন ফোল্ডার তৈরি করুন, নতুন তৈরি ফোল্ডারে ডিরেক্টরি পরিবর্তন করুন, এবং একটি নতুন composer প্রজেক্ট তৈরি করতে নিচের কম্পাউন্ড কমান্ডটি চালান:
composer init -q
এটি একটি নতুন composer.json ফাইল তৈরি করবে যা এরকম দেখাবে:
{ "require": {} }
পরবর্তী, আপনার পাবলিক-ফেসিং কোড ফাইলগুলো রাখার জন্য একটি পাবলিক ফোল্ডার তৈরি করুন। তারপর ফোল্ডারে একটি নতুন index.php ফাইল তৈরি করুন।
PHP ফাইলে এখন কিছু বয়লারপ্লেট কন্টেন্ট দিন এবং একটি সার্ভার শুরু করুন।
<?php echo "Hello World!";
php -S localhost:8080
একটি সিম্পল রাউটার ইনস্টল করা এবং রিকোয়েস্ট হ্যান্ডল করা
প্রজেক্টটি সম্পূর্ণ করতে, একটি সিম্পল PHP রাউটার Altorouter এবং একটি ওয়েব ক্লায়েন্ট Guzzlehttp ইনস্টল করুন।
composer require altorouter/altorouter guzzlehttp/guzzle
index.php-কে আপডেট করুন যাতে এতে এই কোড থাকে:
<?php
// কম্পোজার অটোলোড ফাইল ইম্পোর্ট করুন
require_once __DIR__ . '/../vendor/autoload.php';
// GuzzleHttp ক্লায়েন্ট ইম্পোর্ট করুন
use GuzzleHttp\Client;
// রাউটার এবং ওয়েব ক্লায়েন্ট ইনস্ট্যানশিয়েট করুন
$router = new AltoRouter();
$client = new Client();
// স্যাম্পল রুট রেজিস্টার করুন
$router->map('GET', '/', function () {
// রেসপন্স Content-Type হেডার সেট করুন
header('Content-Type: application/json; charset=utf-8');
// বেসিক রেসপন্স রিটার্ন করুন
echo json_encode(['data' => 'Hello World']);
});
/**
* সব ফটো পেতে রুট
*/
$router->map('GET', '/photos', function () use ($client) {
// JSONPlaceholder-এ রিকোয়েস্ট করুন
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => json_decode($response->getBody()->getContents())
]);
});
/**
* আইডি দ্বারা একটি ফটো পেতে রুট
*/
$router->map('GET', '/photos/[i:id]', function (int $id) use ($client) {
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos/' . $id);
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => json_decode($response->getBody()->getContents())
]);
});
$match = $router->match();
if( is_array($match) && is_callable( $match['target'] ) ) {
call_user_func_array( $match['target'], $match['params'] );
} else {
// কোনো রুট ম্যাচ হয়নি
header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}
কোডটি স্বয়ংস্পষ্ট। কিন্তু স্পষ্টতার জন্য একটু ব্রেকডাউন: লাইন ১-১১-এ, প্রয়োজনীয় ক্লাসগুলো GuzzleHttp এবং AltoRouter ইম্পোর্ট এবং ইনস্ট্যানশিয়েট করা হয়েছে।
লাইন ১৪-২০-এ, প্রথম রুট রেজিস্টার করা হয়েছে, একটি সিম্পল ক্লোজার দিয়ে যা "Hello World!" রিটার্ন করে। লাইন ২৫-৪৫-এ আরও দুটি রুট রেজিস্টার করা হয়েছে, একটি সব ফটো ফেচ করার জন্য /photos এবং অন্যটি একটি ফটো ফেচ করার জন্য /photos/id।
শেষের লাইনগুলো রাউটার প্যাকেজের ডকুমেন্টেশনের অনুযায়ী আবশ্যক যাতে রুট ডিক্লেশন-এ সেট করা ক্লোজারগুলো এক্সিকিউট হয়।
আপনি এই রুটগুলো Postman ব্যবহার করে পরীক্ষা করতে পারেন।
/photos রুট প্রতি রিকোয়েস্টে গড়ে ১৪০০ms সময় নেয়। /photos/id রুট গড়ে ৯০০ms সময় নেয়।
Redis ইনস্টল এবং ইনস্ট্যানশিয়েট করা
এই সময়গুলো JSONPlaceholder-এ মূল রিকোয়েস্টের ফলাফল ক্যাশ করে এবং প্রতিবার রিকোয়েস্ট করার বদলে ক্যাশ থেকে রেসপন্স রিটার্ন করে কমাতে পারা যায়।
PHP-র সাথে Redis ব্যবহার করতে, PhpRedis এক্সটেনশন ইনস্টল করুন। এই এক্সটেনশন Redis-র সাথে যোগাযোগের জন্য একটি API প্রদান করে। আপনি সহজে এটি কমান্ড দিয়ে ইনস্টল করতে পারেন:
pecl install redis
ইনস্টলেশনের পর, আপনি আপনার PHP প্রজেক্টে এই ক্লাসটি ব্যবহার করতে পারেন। ক্লাসটি ইম্পোর্ট করুন এবং আপনার index.php ফাইলের শীর্ষে ইনস্ট্যানশিয়েট করুন:
$redis = new Redis();
$redis->connect('127.0.0.1');
এটি করলে, আপনি আপনার প্রজেক্টে Redis ব্যবহার করতে পারবেন।
Redis দিয়ে ডেটা ক্যাশ করা
JSONPlaceholder-র থেকে ফেরত আসা রfony JSON রেসপন্স Redis-এ ১ ঘণ্টা (৩৬০০ সেকেন্ড) এক্সপায়ারি টাইম সহ সংরক্ষণ করুন।
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
$redis->setex(
'photos',
3600,
$response->getBody()->getContents()
);
এখানে, আপনি photos নামে একটি নতুন কি তৈরি করলেন, এটিকে ১ ঘণ্টা এক্সপায়ারেশন টাইম দিলেন, তারপর এটিকে JSONPlaceholder-র থেকে পাওয়া রfony রেসপন্স অ্যাসাইন করলেন।
এই পয়েন্টে API এখনো অনেক সময় নেয় রেসপন্স দিতে। কারণ আপনি শুধু এই রেসপন্সটি সংরক্ষণ করলেন, আপনি Redis ব্যবহার করে রেসপন্স রিটার্ন করছেন না।
এটি ঠিক করতে, যখন একটি নতুন রিকোয়েস্ট আসে, চেক করুন আপনার ইন-মেমরিতে পূর্বে কোনো ডেটা সংরক্ষিত আছে কিনা। হ্যাঁ থাকলে, ইন-মেমরি ডেটা রিটার্ন করুন, না থাকলে JSONPlaceholder-এ কল করুন।
/photos ব্লকটি এইভাবে আপডেট করুন:
/**
* সব ফটো পেতে রুট
*/
$router->map('GET', '/photos', function () use ($client, $redis) {
// চেক করুন Redis-এ কি আছে কিনা
if (!$redis->exists('photos')) {
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
// পরবর্তী ব্যবহারের জন্য ডেটা সংরক্ষণ করুন
$redis->setex(
'photos',
REDIS_STANDARD_EXPIRY,
$response->getBody()->getContents()
);
}
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => json_decode($redis->get('photos'))
]);
});
Postman-এ পরীক্ষা করলে উন্নতি দেখা যাবে, প্রথম কলের পর (মূল কল যেটি ক্যাশ হওয়ার আগে) /photos রুটের গড় রেসপন্স টাইম নামে গিয়ে গড়ে ২০ms, যা ৫০x-এর বেশি উন্নতি। Redis খুব বেশি প্রসেসিং টাইম এবং পাওয়ার বাঁচায়।
/photos/id রুটটিও Redis ব্যবহার করতে আপডেট করুন:
$router->map('GET', '/photos/[i:id]', function (int $id) use ($client, $redis) {
if (!$redis->exists('photos:' . $id)) {
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos/' . $id);
$redis->setex(
'photos:' . $id,
REDIS_STANDARD_EXPIRY,
$response->getBody()->getContents()
);
}
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => json_decode($redis->get('photos:' . $id))
]);
});
/photos/id রুটও এখন অনেক দ্রুত, কারণ এটিকে রেসপন্স পেতে ৫ms-এর কম সময় লাগে, ৪৫x-এর বেশি উন্নতি।
সারসংক্ষেপ
আশা করি আপনি এখন বুঝতে পেরেছেন Redis কী, এর বেসিকস, এবং কীভাবে আপনি এটি ব্যবহার করে আপনার PHP ওয়েব অ্যাপ্লিকেশনের গতি বাড়াতে পারেন। এই আর্টিকেলে ব্যবহৃত কোড ফাইলগুলো আপনি GitHub-এ পাবেন।
আপনার যদি কোনো প্রশ্ন বা প্রাসঙ্গিক পরামর্শ থাকে, দয়া করে আমার সাথে যোগাযোগ করুন সেগুলো শেয়ার করতে।
আমার আরও আর্টিকেল পড়তে বা আমার কাজ ফলো করতে, আপনি LinkedIn, Twitter, এবং GitHub-এ আমার সাথে জুড়ে থাকতে পারেন। এটি দ্রুত, সহজ, এবং বিনামূল্যে!