रेडिस
webman/redis illuminate/redis को कनेक्शन पूल जोड़कर विस्तारित करता है और कोरूटीन तथा गैर-कोरूटीन दोनों वातावरणों में काम करता है। उपयोग लारावेल के समान है।
illuminate/redis उपयोग करने से पहले php-cli के लिए रेडिस एक्सटेंशन इंस्टॉल करना आवश्यक है।
इंस्टॉलेशन
composer require -W webman/redis illuminate/events
इंस्टॉलेशन के बाद रिस्टार्ट आवश्यक है (रिलोड काम नहीं करता)।
कॉन्फ़िगरेशन
रेडिस कॉन्फ़िगरेशन फ़ाइल config/redis.php में है:
return [
'default' => [
'host' => '127.0.0.1',
'username' => null,
'password' => null,
'port' => 6379,
'database' => 0,
'pool' => [ // कनेक्शन पूल सेटिंग
'max_connections' => 10, // पूल में अधिकतम कनेक्शन
'min_connections' => 1, // पूल में न्यूनतम कनेक्शन
'wait_timeout' => 3, // कनेक्शन हासिल करने की अधिकतम प्रतीक्षा (सेकंड)
'idle_timeout' => 50, // इसके बाद कनेक्शन min_connections तक रिलीज़ होते हैं
'heartbeat_interval' => 50, // हार्टबीट अंतराल (60 सेकंड से अधिक न हो)
],
]
];
कनेक्शन पूल के बारे में
- प्रत्येक प्रोसेस का अपना पूल होता है; पूल प्रोसेस के बीच साझा नहीं होते।
- बिना कोरूटीन के निष्पादन अनुक्रमिक होता है, इसलिए अधिकतम एक कनेक्शन उपयोग होता है।
- कोरूटीन के साथ निष्पादन समवर्ती होता है और पूल
min_connectionsसेmax_connectionsके बीच गतिशील रूप से समायोजित होता है। - जब रेडिस इस्तेमाल करने वाले कोरूटीन की संख्या
max_connectionsसे अधिक हो, तो वे अधिकतमwait_timeoutसेकंड प्रतीक्षा करते हैं; उसके बाद अपवाद फेंका जाता है। - निष्क्रिय अवस्था में (कोरूटीन हो या न हो) कनेक्शन
idle_timeoutके बाद रिलीज़ होते हैं जब तकmin_connectionsन रह जाए (0 मान्य है)।
उदाहरण
<?php
namespace app\controller;
use support\Request;
use support\Redis;
class UserController
{
public function db(Request $request)
{
$key = 'test_key';
Redis::set($key, rand());
return response(Redis::get($key));
}
}
रेडिस एपीआई
Redis::append($key, $value)
Redis::bitCount($key)
Redis::decr($key, $value)
Redis::decrBy($key, $value)
Redis::get($key)
Redis::getBit($key, $offset)
Redis::getRange($key, $start, $end)
Redis::getSet($key, $value)
Redis::incr($key, $value)
Redis::incrBy($key, $value)
Redis::incrByFloat($key, $value)
Redis::mGet(array $keys)
Redis::getMultiple(array $keys)
Redis::mSet($pairs)
Redis::mSetNx($pairs)
Redis::set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null)
Redis::setBit($key, $offset, $value)
Redis::setEx($key, $ttl, $value)
Redis::pSetEx($key, $ttl, $value)
Redis::setNx($key, $value)
Redis::setRange($key, $offset, $value)
Redis::strLen($key)
Redis::del(...$keys)
Redis::exists(...$keys)
Redis::expire($key, $ttl)
Redis::expireAt($key, $timestamp)
Redis::select($dbIndex)
इसके समतुल्य:
$redis = Redis::connection('default');
$redis->append($key, $value)
$redis->bitCount($key)
$redis->decr($key, $value)
$redis->decrBy($key, $value)
$redis->get($key)
$redis->getBit($key, $offset)
...
ध्यान दें
Redis::select($db)एपीआई सावधानी से उपयोग करें। चूंकि वेबमैन मेमोरी में स्थायी फ्रेमवर्क है, एक अनुरोध में डेटाबेस बदलने से बाद के अनुरोध प्रभावित होते हैं। कई डेटाबेस के लिए प्रत्येक$dbके लिए अलग रेडिस कनेक्शन कॉन्फ़िगर करने की सलाह दी जाती है।
कई रेडिस कनेक्शन उपयोग करना
config/redis.php कॉन्फ़िगरेशन फ़ाइल में उदाहरण:
return [
'default' => [
'host' => '127.0.0.1',
'username' => null,
'password' => null,
'port' => 6379,
'database' => 0,
],
'cache' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1,
],
]
डिफ़ॉल्ट रूप से default के अंतर्गत कॉन्फ़िगर कनेक्शन उपयोग होता है। कौन सा रेडिस कनेक्शन उपयोग करना है यह चुनने के लिए Redis::connection() मेथड का उपयोग करें:
$redis = Redis::connection('cache');
$redis->get('test_key');
क्लस्टर कॉन्फ़िगरेशन
अगर आपके ऐप में रेडिस सर्वर क्लस्टर का उपयोग है, तो कॉन्फ़िगरेशन में clusters कुंजी के अंतर्गत परिभाषित करें:
return [
'clusters' => [
'default' => [
[
'host' => 'localhost',
'username' => null,
'password' => null,
'port' => 6379,
'database' => 0,
],
],
],
];
डिफ़ॉल्ट रूप से क्लस्टर नोड पर क्लाइंट-साइड शार्डिंग कर सकता है, जिससे नोड पूल और बड़ी मेमोरी संभव होती है। ध्यान दें कि क्लाइंट शार्डिंग विफलता नहीं संभालता; इसलिए यह मुख्यतः दूसरी मुख्य डेटाबेस से कैश डेटा के लिए उपयुक्त है। रेडिस नेटिव क्लस्टर के लिए कॉन्फ़िगरेशन में options के अंतर्गत निर्दिष्ट करें:
return[
'options' => [
'cluster' => 'redis',
],
'clusters' => [
// ...
],
];
पाइपलाइन कमांड
जब एक ऑपरेशन में सर्वर को कई कमांड भेजने हों तो पाइपलाइन का उपयोग करें। pipeline मेथड एक closure स्वीकार करता है; सभी कमांड एक ही ऑपरेशन में निष्पादित होते हैं:
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});