Redis क्या है?
Redis एक डेटा स्टोर है जो डेटा को मुख्य रूप से मेमोरी (RAM) में संग्रहीत करता है। यह पारंपरिक डेटाबेस की तुलना में बहुत तेज़ है, क्योंकि वे डेटा को डिस्क पर स्टोर करते हैं। इसी गति के कारण Redis को अक्सर कैशिंग टूल के रूप में उपयोग किया जाता है।
Redis की-वैल्यू पेयर सिस्टम का उपयोग करके किसी भी डेटा टाइप में डेटा स्टोर कर सकता है। यह पारंपरिक डेटाबेस से अलग है जो डॉक्यूमेंट्स या रो (rows) का उपयोग करते हैं। आप Redis डेटाबेस को एक बड़े JSON ऑब्जेक्ट की तरह समझ सकते हैं, जहां हर चीज़ एक की-वैल्यू पेयर होती है। इसलिए यह संरचित डेटा स्टोर करने के लिए सबसे अच्छा विकल्प नहीं हो सकता।
आप Redis को डेटाबेस के रूप में भी उपयोग कर सकते हैं, क्योंकि इसमें डेटा को डिस्क पर लिखकर पर्सिस्टेंस (persistence) की क्षमता होती है। आप Redis को समय-समय पर या हर कमांड के बाद डेटा पर्सिस्ट करने के लिए कॉन्फ़िगर कर सकते हैं। जब Redis को पर्सिस्टेंस के लिए कॉन्फ़िगर नहीं किया जाता, तो यह बहुत अस्थिर होता है, और सिस्टम क्रैश होने पर डेटा लॉस हो सकता है।
Redis प्रोडक्शन-लेवल एप्लिकेशन में लोकप्रिय है और Twitter, GitHub, Snapchat और StackOverflow जैसी बड़ी कंपनियों द्वारा उपयोग किया जाता है।
Redis के मुख्य उपयोग मामले
- वन-टाइम पासवर्ड (OTP) के लिए: ये आमतौर पर एक बार उपयोग के लिए जनरेट होते हैं और इनकी लाइफस्पैन छोटी होती है। Redis की एक्सपायरी डेट सेट करने की क्षमता के साथ, आप OTP को सुरक्षित रूप से स्टोर कर सकते हैं बिना एक निश्चित अवधि के बाद उन्हें मैन्युअली डिलीट करने की चिंता किए।
- अक्सर एक्सेस किए जाने वाले रिसोर्स के लिए: ऐसे डेटा के लिए जो बार-बार एक्सेस होता है लेकिन बार-बार नहीं बदलता, आप Redis का उपयोग करके डेटाबेस क्वेरी या एक्सटर्नल सर्विस कॉल में लगने वाले समय को बचा सकते हैं।
- भारी क्वेरी के लिए: उन डेटाबेस क्वेरी के लिए जिनमें समय लगता है और जो अक्सर नहीं बदलतीं, Redis का उपयोग करके परिणामों को जितनी देर चाहें स्टोर करके इस समय को कम कर सकते हैं।
Redis कैसे इंस्टॉल करें
आप Redis को किसी भी ऑपरेटिंग सिस्टम पर इंस्टॉल कर सकते हैं। यहां macOS, Windows Subsystem for Linux (WSL), और Linux के लिए निर्देश दिए गए हैं।
macOS
macOS पर Redis इंस्टॉल करने के लिए, चलाएं:
brew install redis
फिर Redis शुरू करने के लिए यह कमांड चलाएं:
redis-server
Windows Subsystem for Linux और Linux
Redis अभी तक Windows ऑपरेटिंग सिस्टम को सीधे सपोर्ट नहीं करता, इसलिए आप Windows पर WSL (Windows Subsystem for Linux) इंस्टॉल करके Linux एनवायरनमेंट प्राप्त कर सकते हैं।
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 की की जांच करके टेस्ट कर सकते हैं।
कीज़ के लिए टाइम टू लिव (TTL) कैसे सेट करें
Redis आपको यह निर्दिष्ट करने देता है कि कोई की कितनी देर तक मौजूद रहनी चाहिए। यह Redis की एक बेहतरीन विशेषता है। इसके लिए SETEX कीवर्ड का उपयोग करें:
SETEX key seconds value
आप TTL कीवर्ड का उपयोग करके किसी विशिष्ट की के लिए टाइम टू लिव चेक कर सकते हैं। यह -1 लौटाता है अगर की की कोई एक्सपायरी सेट नहीं है (यानी अनिश्चित काल तक स्टोर रहेगी)। यह -2 लौटाता है अगर की मौजूद नहीं है। और यह सेकंड में समय लौटाता है अगर की मौजूद है और एक्सपायर होगी।
आप EXPIRE कीवर्ड का उपयोग करके पहले से बनी बिना एक्सपायरी वाली की के लिए एक्सपायरी टाइम (सेकंड में) सेट कर सकते हैं। उदाहरण के लिए, age वैरिएबल को स्टोर करने के लिए एक की बनाएं जिसकी वैल्यू 26 है:
SET age 26
फिर इसके लिए 10 सेकंड का एक्सपायरी टाइम सेट करें:
EXPIRE age 20
बार-बार TTL चेक करके देखें कि यह कैसे कम होता है और अंत में की मौजूद नहीं रहती।
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
// Composer ऑटोलोड फाइल इम्पोर्ट करें
require_once __DIR__ . '/../vendor/autoload.php';
// GuzzleHttp Client इम्पोर्ट करें
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())
]);
});
/**
* 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 {
// कोई रूट मैच नहीं हुआ
header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}
कोड काफी हद तक सेल्फ-एक्सप्लेनेटरी है। लेकिन स्पष्टता के लिए यहां ब्रेकडाउन है। लाइन 1-11 से, आवश्यक क्लास GuzzleHttp और AltoRouter इम्पोर्ट और इंस्टेंटिएट की गई हैं।
लाइन 14-20 से, पहला रूट रजिस्टर किया गया है, एक साधारण क्लोजर के साथ जो "Hello World!" लौटाता है। लाइन 25-45 दो और रूट रजिस्टर करते हैं, एक सभी फोटो लाने के लिए /photos और दूसरा सिंगल फोटो लाने के लिए /photos/id।
अंतिम लाइनें राउटर पैकेज के डॉक्यूमेंटेशन के आधार पर आवश्यक हैं ताकि रूट डिक्लेरेशन में सेट क्लोजर को वास्तव में एक्जीक्यूट किया जा सके।
आप इन रूट्स को Postman का उपयोग करके टेस्ट कर सकते हैं।
/photos रूट प्रति रिक्वेस्ट औसतन 1400ms लेता है। /photos/id औसतन 900ms प्रति रिक्वेस्ट लेता है।
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 से लौटे रॉ JSON रिस्पॉन्स को 1 घंटे (3600 सेकंड) के एक्सपायरी टाइम के साथ Redis में स्टोर करें।
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
$redis->setex(
'photos',
3600,
$response->getBody()->getContents()
);
यहां, आप photos नामक एक नई की बनाते हैं, इसे 1 घंटे का एक्सपायरी टाइम देते हैं, फिर इसे JSONPlaceholder से प्राप्त रॉ रिस्पॉन्स असाइन करते हैं।
लेकिन इस बिंदु पर 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 रूट के लिए औसत प्रतिक्रिया समय गिरकर औसतन 20ms हो गया है। यह 50x से अधिक का सुधार है। 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 रूट अब भी बहुत तेज़ है क्योंकि इसे प्रतिक्रिया प्राप्त करने में 5ms से कम समय लगता है, 45x से अधिक का सुधार।
सारांश
मुझे उम्मीद है कि अब आप समझ गए होंगे कि Redis क्या है, इसकी मूल बातें, और कैसे आप इसका उपयोग अपने PHP वेब एप्लिकेशन की गति बढ़ाने के लिए कर सकते हैं। आप इस लेख में उपयोग की गई कोड फाइलें GitHub पर पा सकते हैं।
अगर आपके कोई प्रश्न या प्रासंगिक सलाह है, तो कृपया मुझसे संपर्क करके उन्हें साझा करें।
मेरे और लेख पढ़ने या मेरे काम को फॉलो करने के लिए, आप LinkedIn, Twitter, और GitHub पर मुझसे जुड़ सकते हैं। यह त्वरित है, आसान है, और मुफ़्त है!
मुफ़्त में कोड करना सीखें। freeCodeCamp का ओपन सोर्स पाठ्यक्रम 40,000 से अधिक लोगों को डेवलपर के रूप में नौकरी पाने में मदद कर चुका है। शुरू करें