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

পিএইচপি-র জন্য রেডিস মাস্টারিং:ইন-মেমরি ক্যাশিংয়ের জন্য একটি ব্যবহারিক গাইড

পিএইচপি-র জন্য রেডিস মাস্টারিং:ইন-মেমরি ক্যাশিংয়ের জন্য একটি ব্যবহারিক গাইড

রেডিস একটি ডেটা স্টোর যা প্রাথমিকভাবে মেমরিতে ডেটা সংরক্ষণ করে। এটি প্রথাগত ডাটাবেসের চেয়ে দ্রুত, এবং বেশ জনপ্রিয় হয়েছে।

এই টিউটোরিয়ালে, আপনি 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-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন


  1. HTML DOM টেবিল অবজেক্ট

  2. প্রদত্ত তির্যক দৈর্ঘ্য সহ ষড়ভুজের ক্ষেত্রফলের জন্য সি প্রোগ্রাম?

  3. Tkinter এ বোতামে বিটম্যাপ ইমেজ কিভাবে ব্যবহার করবেন?

  4. iOS এ নেভিগেশন বারের জন্য পটভূমি কিভাবে সেট করবেন?