রেডিস একটি ডেটা স্টোর যা প্রাথমিকভাবে মেমরিতে ডেটা সংরক্ষণ করে। এটি প্রথাগত ডাটাবেসের চেয়ে দ্রুত, এবং বেশ জনপ্রিয় হয়েছে।
এই টিউটোরিয়ালে, আপনি Redis কীভাবে কাজ করে, কখন এটি ব্যবহার করবেন, কীভাবে এটি আপনার ডিভাইসে ইনস্টল করবেন এবং কীভাবে এটি একটি PHP ওয়েব অ্যাপ্লিকেশনে ক্যাশিং সিস্টেম হিসাবে ব্যবহার করবেন তার প্রাথমিক বিষয়গুলি শিখবেন৷
Redis কি?
রেডিস হল একটি ডাটা স্টোর - যেমন একটি ডাটাবেস, কিন্তু যেটি প্রাথমিকভাবে মেমরিতে ডেটা সঞ্চয় করে। এটি প্রথাগত ডাটাবেসের তুলনায় এটিকে অনেক দ্রুত করে তোলে যেখানে ডেটা ডিস্কে সংরক্ষণ করা হয়। এই গতির কারণে, রেডিস প্রায়শই ক্যাশিং টুল হিসাবে ব্যবহৃত হয়।
রেডিস যেকোন ডেটা টাইপের ডেটা সঞ্চয় করতে পারে, কারণ এটি ডেটা সঞ্চয় করার জন্য একটি কী-মান পেয়ার সিস্টেম ব্যবহার করে। এটি প্রথাগত ডেটাবেসগুলির থেকেও ভিন্ন যা নথি বা সারি ব্যবহার করে।
আপনি একটি রেডিস ডাটাবেসকে একটি বড় JSON অবজেক্ট হিসাবে ভাবতে পারেন, যেখানে ডাটাবেসের সবকিছুই একটি মূল-মান জোড়া। এর মানে হল এটি স্ট্রাকচার্ড ডেটা সঞ্চয় করার সেরা জায়গা নাও হতে পারে।
আপনি রেডিসকে ডাটাবেস হিসাবেও ব্যবহার করতে পারেন, কারণ এটি অধ্যবসায়ের জন্য ডিস্কে ডেটা লেখার ক্ষমতা রাখে। আপনি নিয়মিতভাবে বা আপনার ইস্যু করা প্রতিটি কমান্ডের পরে ডেটা বজায় রাখতে Redis কনফিগার করতে পারেন। যখন রেডিস ডেটা টিকে থাকার জন্য কনফিগার করা হয় না, তখন এটি খুবই উদ্বায়ী, এবং একটি সিস্টেম ক্র্যাশের ফলে ডেটা নষ্ট হয়ে যায়৷
রেডিস প্রোডাকশন লেভেল অ্যাপ্লিকেশানে জনপ্রিয় এবং এটি টুইটার, গিথুব, স্ন্যাপচ্যাট এবং স্ট্যাকওভারফ্লো-এর মতো বড় কোম্পানিগুলি ব্যবহার করে৷
- ওয়ান টাইম পাসওয়ার্ডের জন্য (OTP):এগুলি সাধারণত একবার ব্যবহার করার জন্য তৈরি হয় এবং এর আয়ু কম থাকে। ডেটার জন্য একটি মেয়াদ শেষ হওয়ার তারিখ সেট করার রেডিসের ক্ষমতার সাথে, আপনি একটি নির্দিষ্ট সময়ের পরে সেগুলি মুছে ফেলার বিষয়ে চিন্তা না করে নিরাপদে OTP সংরক্ষণ করতে পারেন৷
- ঘন ঘন অ্যাক্সেস করা সংস্থানগুলির জন্য:যে ডেটা খুব ঘন ঘন পরিবর্তিত হয় না কিন্তু প্রচুর পরিমাণে অ্যাক্সেস করা হয়, আপনি রেডিস ব্যবহার করতে পারেন সময় বাঁচাতে যা ডেটাবেস অনুসন্ধান করতে বা কোনও বহিরাগত পরিষেবাতে কল করার জন্য ব্যয় হত৷
- ভারী দায়িত্বের প্রশ্নগুলির জন্য:ডেটাবেস কোয়েরিগুলির জন্য যেগুলি সময় নেয় এবং খুব ঘন ঘন পরিবর্তন হয় না, রেডিস ব্যবহার করুন এই সময় কমাতে ফলাফলগুলি যতক্ষণ চান ততক্ষণ সংরক্ষণ করে৷
কিভাবে রেডিস ইনস্টল করবেন
আপনি যেকোনো অপারেটিং সিস্টেমে রেডিস ইনস্টল করতে পারেন। এখানে ম্যাকওএস, লিনাক্সের জন্য উইন্ডোজ সাবসিস্টেম এবং লিনাক্সের নির্দেশাবলী রয়েছে।
macOS
MacOS-এ Redis ইনস্টল করতে, চালান:
brew install redis
তারপর, Redis শুরু করতে এই কমান্ডটি চালান:
redis-server
লিনাক্স এবং লিনাক্সের জন্য উইন্ডোজ সাবসিস্টেম
রেডিস এখনও উইন্ডোজ অপারেটিং সিস্টেমকে ঠিক সমর্থন করে না, তাই আপনি লিনাক্স পরিবেশ পেতে উইন্ডোজে WSL (লিনাক্সের জন্য উইন্ডোজ সাবসিস্টেম) ইনস্টল করতে পারেন।
লিনাক্সে রেডিস ইনস্টল করতে, চালান:
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" আউটপুট করবে . এই মত:
রিডিস ইনস্টলেশন পরীক্ষা করা হচ্ছে
রেডিস বেসিকস
রেডিসকে REPL বা স্বতন্ত্র অ্যাপ্লিকেশন হিসাবে ব্যবহার করতে, redis-cli চালান . এটি REPL পরিবেশ খুলবে৷
কিভাবে ডেটা সেট করবেন
SET ব্যবহার করুন Redis-এ একটি মূল মান জোড়া সেট করতে কীওয়ার্ড। একটি username সেট করতে Zubs মানের কী , এটি চালান:
SET username Zubs
একটি মূল-মান জোড়া সেট করা৷
কিভাবে ডেটা পেতে হয়
সম্প্রতি সংরক্ষিত username পেতে কী, GET ব্যবহার করুন এই মত কীওয়ার্ড:
GET username
কী দ্বারা একটি মান পাওয়া
কিভাবে ডেটা মুছবেন
আপনি DEL ব্যবহার করে পূর্বে সংরক্ষিত একটি কী মুছে ফেলতে পারেন এই মত কীওয়ার্ড:
DEL username
কী দ্বারা একটি মান মুছে ফেলা
একটি মান বিদ্যমান কিনা তা কীভাবে পরীক্ষা করবেন
আপনি EXISTS ব্যবহার করে একটি কীটির অস্তিত্ব পরীক্ষা করতে পারেন কীওয়ার্ড এটি 0 প্রদান করে যখন কী বিদ্যমান থাকে না, এবং 1 যদি এটা করে আপনি সম্প্রতি মুছে ফেলা username চেক করে পরীক্ষা করতে পারেন কী বিদ্যমান। এই মত:
কীসের জন্য বাঁচার জন্য একটি সময় কীভাবে সেট করবেন
রেডিস আপনাকে নির্দিষ্ট করতে দেয় যে এটি তৈরি করার সময় কোন কী কতক্ষণ থাকা উচিত। এটি রেডিসের একটি সত্যিই দুর্দান্ত বৈশিষ্ট্য। এটি করতে, SETEX ব্যবহার করুন এই মত কীওয়ার্ড:
SETEX key seconds value
আপনি TTL ব্যবহার করে একটি নির্দিষ্ট কীটির জন্য লাইভের সময় পরীক্ষা করতে পারেন কীওয়ার্ড এটি -1 প্রদান করে যদি কীটির মেয়াদ শেষ না হয়, মানে এটি অনির্দিষ্টকালের জন্য সংরক্ষণ করা হবে। এটি -2 প্রদান করে যদি চাবিটি বিদ্যমান না থাকে। এবং কীটি বিদ্যমান থাকলে এটি সেকেন্ডে সময় ফেরত দেয়।
আপনি EXPIRE ব্যবহার করে মেয়াদ শেষ হওয়ার সময় ছাড়াই আগে তৈরি করা একটি কীটির জন্য সেকেন্ডের মধ্যে একটি মেয়াদ শেষ হওয়ার সময় সেট করতে পারেন কীওয়ার্ড উদাহরণস্বরূপ, একটি পরিবর্তনশীল age সংরক্ষণ করার জন্য একটি কী তৈরি করুন 26 এর মান সহ .
SET age 26
তারপরে, এটির জন্য 10 সেকেন্ডের মেয়াদ শেষ হওয়ার সময় সেট করুন।
EXPIRE age 20
এটি আসলে কীভাবে কমে যায় এবং শেষ পর্যন্ত আর বিদ্যমান থাকে না তা দেখতে কয়েকবার বারবার বাঁচতে বাকি সময় পরীক্ষা করুন৷
কিভাবে রেডিস দিয়ে একটি সহজ অ্যাপ্লিকেশন তৈরি করবেন
রেডিস কীভাবে কাজ করে তা বোঝার জন্য আপনাকে সাহায্য করার জন্য, আমরা এখন একটি বেসিক ওয়েব অ্যাপ্লিকেশন তৈরি করব যা রেডিস ব্যবহার করে ডেটা ক্যাশে দ্রুত প্রতিক্রিয়া লোড করতে। আপনি একটি সাধারণ অ্যাপ্লিকেশন তৈরি করবেন যা JSONPlaceholder থেকে চিত্র ডেটা নিয়ে আসে এবং সেগুলি ফেরত দেয়৷
কম্পোজার ব্যবহার করে একটি নতুন পিএইচপি প্রকল্প তৈরি করুন
প্রকল্পের জন্য একটি নতুন ফোল্ডার তৈরি করুন, নতুন তৈরি ফোল্ডারে ডিরেক্টরি পরিবর্তন করুন এবং একটি নতুন কম্পোজার প্রকল্প তৈরি করতে নিম্নলিখিত যৌগটি চালান:
composer init -q
এটি একটি নতুন composer.json তৈরি করবে ফাইল যা দেখতে এইরকম হওয়া উচিত:
{
"require": {}
}
এরপরে, আপনার পাবলিক ফেসিং কোড ফাইল রাখার জন্য একটি পাবলিক ফোল্ডার তৈরি করুন। তারপর একটি নতুন index.php তৈরি করুন ফোল্ডারে ফাইল।
আপাতত পিএইচপি ফাইলে কিছু বয়লারপ্লেট কন্টেন্ট রাখুন এবং একটি সার্ভার শুরু করুন।
<?php
echo "Hello World!";
php -S localhost:8080
একটি সাধারণ রাউটার ইনস্টল করুন এবং অনুরোধগুলি পরিচালনা করুন
প্রকল্পটি সম্পূর্ণ করতে, একটি সাধারণ PHP রাউটার ইনস্টল করুন, Altorouter , এবং একটি ওয়েব ক্লায়েন্ট, Guzzlehttp .
composer require altorouter/altorouter guzzlehttp/guzzle
index.php আপডেট করুন এই কোডটি ধারণ করতে:
<?php
// Import composer autoload file
require_once __DIR__ . '/../vendor/autoload.php';
// Import GuzzleHttp Client
use GuzzleHttp\Client;
// Instantiate router and web client
$router = new AltoRouter();
$client = new Client();
// Register Sample route
$router->map('GET', '/', function () {
// Set response Content-Type
header('Content-Type: application/json; charset=utf-8');
// Return basic response
echo json_encode(['data' => 'Hello World']);
});
/**
* Route to get all photos
*/
$router->map('GET', '/photos', function () use ($client) {
// Make request to 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())
]);
});
/**
* Route to get single photo by id
*/
$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 {
// no route was matched
header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}
কোডটি বেশ স্ব-ব্যাখ্যামূলক। কিন্তু, এখানে স্পষ্টতার জন্য একটি ভাঙ্গন আছে. লাইন 1-11 থেকে, প্রয়োজনীয় ক্লাস GuzzleHttp এবং AltoRouter আমদানি করা হয় এবং তাৎক্ষণিক হয়৷
লাইন 14-20 থেকে, প্রথম রুটটি নিবন্ধিত হয়, একটি সাধারণ বন্ধের সাথে যা "হ্যালো ওয়ার্ল্ড!" ফেরত দেয়। লাইন 25-45 আরও দুটি রুট নিবন্ধন করে, একটি সমস্ত ফটো আনার জন্য, /photos এবং অন্য একটি ছবি আনতে, /photos/id .
রাউটার প্যাকেজের ডকুমেন্টেশনের উপর ভিত্তি করে চূড়ান্ত লাইনের প্রয়োজন হয় প্রকৃতপক্ষে রুট ঘোষণায় সেট করা বন্ধগুলি কার্যকর করার জন্য।
আপনি পোস্টম্যান ব্যবহার করে এই রুটগুলি পরীক্ষা করতে পারেন৷
৷
হ্যালো ওয়ার্ল্ড রুট
সমস্ত ফটো রুট পান
একটি ফটো রুট পান৷
/photos রুট প্রতি অনুরোধে গড়ে 1400ms লাগে। /photos/id প্রতি অনুরোধে গড়ে 900ms লাগে।
ইনস্টল করুন এবং পুনরায় ইনস্ট্যান্টিয়েট করুন
এই সময়গুলি JSONPlaceholder-এ মূল অনুরোধের ফলাফল ক্যাশ করে, তারপর প্রতিবার অনুরোধ করার পরিবর্তে ক্যাশে থেকে একটি প্রতিক্রিয়া ফিরিয়ে দিয়ে কমানো যেতে পারে।
PHP এর সাথে Redis ব্যবহার করতে, PhpRedis এক্সটেনশনটি ইনস্টল করুন। এই এক্সটেনশনটি Redis এর সাথে যোগাযোগের জন্য একটি API প্রদান করে। আপনি কমান্ড ব্যবহার করে সহজেই এটি ইনস্টল করতে পারেন:
pecl install redis
ইনস্টলেশনের পরে, আপনি আপনার পিএইচপি প্রকল্পে এই ক্লাসটি ব্যবহার করতে পারেন। ক্লাসটি ইম্পোর্ট করুন এবং আপনার index.php এর উপরে এটিকে ইনস্ট্যান্টিয়েট করুন ফাইল:
$redis = new Redis();
$redis->connect('127.0.0.1');
এটি করার পরে, আপনি এখন আপনার প্রকল্পে Redis ব্যবহার করতে পারেন৷
৷কিভাবে রেডিস দিয়ে ডেটা ক্যাশে করবেন
1 ঘন্টা (3600 সেকেন্ড) মেয়াদ শেষ হওয়ার সাথে JSONPlaceholder থেকে Redis-এ ফিরে আসা কাঁচা JSON প্রতিক্রিয়া সংরক্ষণ করুন।
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
$redis->setex(
'photos',
3600,
$response->getBody()->getContents()
);
এখানে, আপনি photos নামে একটি নতুন কী তৈরি করুন , এটির মেয়াদ শেষ হওয়ার সময় 1 ঘন্টা দিন, তারপর এটিকে JSONPlaceholder থেকে প্রাপ্ত কাঁচা প্রতিক্রিয়া বরাদ্দ করুন৷
কিন্তু এই মুহুর্তে API এখনও প্রতিক্রিয়া জানাতে দীর্ঘ সময় নেয়। এর কারণ হল আপনি শুধুমাত্র এই প্রতিক্রিয়াটি সংরক্ষণ করছেন, আপনি প্রতিক্রিয়া ফেরত দিতে Redis ব্যবহার করছেন না।
এটি ঠিক করার জন্য, যখন একটি নতুন অনুরোধ আসে, আপনার কাছে পূর্বে মেমরিতে সংরক্ষিত কিছু ডেটা আছে কিনা তা পরীক্ষা করে দেখুন। যদি হ্যাঁ, আপনি মেমরিতে ডেটা ফেরত দেন, অন্যথায়, আপনি JSONPlaceholder-এ একটি কল করেন৷
/photos আপডেট করুন এটি ব্লক করুন:
/**
* Route to get all photos
*/
$router->map('GET', '/photos', function () use ($client, $redis) {
// Check if Redis has the key
if (!$redis->exists('photos')) {
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
// Store the data for next use
$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'))
]);
});
উন্নতিগুলি দেখতে পোস্টম্যানে পরীক্ষা করা হচ্ছে, আপনি প্রথম কলের পরে গড় প্রতিক্রিয়া সময় দেখতে পাচ্ছেন (ক্যাশ করার আগে আসল কল) /photos-এর জন্য গড়ে 20ms এ নেমে গেছে রুট এটি 50x এর বেশি উন্নতি। রেডিস প্রক্রিয়াকরণের অনেক সময় এবং শক্তি সাশ্রয় করে।
/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 রুট এখন অনেক দ্রুত কারণ এটি একটি প্রতিক্রিয়া পেতে 5ms এর কম সময় নেয়, 45x এর বেশি উন্নতি৷
সারাংশ
আমি আশা করি আপনি এখন বুঝতে পেরেছেন যে রেডিস কী, এর মূল বিষয়গুলি এবং কীভাবে আপনি আপনার পিএইচপি ওয়েব অ্যাপ্লিকেশনগুলির গতি বাড়ানোর জন্য এটি ব্যবহার করতে পারেন। আপনি GitHub এ এই নিবন্ধে ব্যবহৃত কোড ফাইলগুলি খুঁজে পেতে পারেন৷
৷যদি আপনার কোন প্রশ্ন বা প্রাসঙ্গিক পরামর্শ থাকে, তাহলে অনুগ্রহ করে সেগুলি শেয়ার করতে আমার সাথে যোগাযোগ করুন।
আমার আরো নিবন্ধ পড়তে বা আমার কাজ অনুসরণ করতে, আপনি LinkedIn, Twitter, এবং Github এ আমার সাথে সংযোগ করতে পারেন। এটি দ্রুত, এটি সহজ, এবং এটি বিনামূল্যে!
বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন