Redis

webman/redis ने illuminate/redis के आधार पर कनेक्शन पूल फ़ंक्शन जोड़ा है, जो सह-निष्पादित और गैर-सह-निष्पादित वातावरण दोनों का समर्थन करता है, और इसका उपयोग Laravel के समान है।

illuminate/redis का उपयोग करने से पहले, आपको php-cli पर Redis एक्सटेंशन स्थापित करना होगा।

ध्यान दें
वर्तमान हैंडबुक webman v2 संस्करण के लिए है, यदि आप webman v1 संस्करण का उपयोग कर रहे हैं, तो कृपया v1 संस्करण की हैंडबुक को देखें।
इस कंपोनेंट को Redis एक्सटेंशन स्थापित करने की आवश्यकता है, php -m | grep redis कमांड का उपयोग करके यह जांचें कि php-cli पर Redis एक्सटेंशन स्थापित है या नहीं।

स्थापना

composer require -W webman/redis illuminate/events

स्थापना के बाद आपको restart करना होगा (reload प्रभावी नहीं है)

कॉन्फ़िगरेशन

Redis कॉन्फ़िगरेशन फ़ाइल config/redis.php में है

return [
    'default' => [
        'host'     => '127.0.0.1',
        '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 सेकंड से अधिक नहीं होना चाहिए
        ],
    ]
];

कनेक्शन पूल के बारे में

  • प्रत्येक प्रक्रिया के पास अपना कनेक्शन पूल होता है, प्रक्रियाओं के बीच कनेक्शन पूल साझा नहीं होता है।
  • सह-निष्पादन बंद होने पर, व्यवसाय प्रक्रिया के भीतर कतारबद्ध होते हैं, जिससे समवर्तीता नहीं उत्पन्न होती, इसलिए कनेक्शन पूल में अधिकतम केवल 1 कनेक्शन होता है।
  • सह-निष्पादन चालू करने पर, व्यवसाय प्रक्रिया के भीतर समवर्ती रूप से निष्पादित होते हैं, कनेक्शन पूल आवश्यकतानुसार कनेक्शन की संख्या को गतिशील रूप से समायोजित करेगा, जो max_connections से अधिक और min_connections से कम नहीं हो सकता।
  • क्यू में कनेक्शन की अधिकतम संख्या max_connections होने के कारण, जब Redis के सह-निष्पादन की संख्या max_connections से अधिक होती है, तो क्यू में सह-निष्पादन प्रतीक्षा करते हैं, अधिकतम wait_timeout सेकंड के लिए, इससे अधिक होने पर अपवाद उत्पन्न होगा।
  • निष्क्रिय स्थिति में (सह-निष्पादन और गैर-सह-निष्पादन वातावरण दोनों में), कनेक्शन idle_timeout समय के बाद पुनर्प्राप्त कर लिए जाएंगे, जब तक कि कनेक्शन की संख्या min_connections तक न पहुंचे (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 इंटरफ़ेस

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) इंटरफ़ेस का सावधानी पूर्वक उपयोग करें, क्योंकि webman एक स्थायी मेमोरी ढांचा है, यदि कोई अनुरोध Redis::select($db) का उपयोग करता है और डेटाबेस स्विच करता है, तो यह अन्य अनुरोधों को प्रभावित करेगा। विभिन्न डेटाबेस के लिए विभिन्न $db को विभिन्न Redis कनेक्शन कॉन्फ़िगरेशन के रूप में सेट करने की सलाह दी जाती है।

कई Redis कनेक्शनों का उपयोग

उदाहरण के लिए कॉन्फ़िगरेशन फ़ाइल config/redis.php

return [
    'default' => [
        'host'     => '127.0.0.1',
        'password' => null,
        'port'     => 6379,
        'database' => 0,
    ],

    'cache' => [
        'host'     => '127.0.0.1',
        'password' => null,
        'port'     => 6379,
        'database' => 1,
    ],

]

डिफ़ॉल्ट रूप से default के तहत कॉन्फ़िगर किया गया कनेक्शन का उपयोग किया जाता है, आप Redis::connection() विधि का उपयोग करके यह चुन सकते हैं कि कौन सा Redis कनेक्शन का उपयोग करना है।

$redis = Redis::connection('cache');
$redis->get('test_key');

क्लस्टर कॉन्फ़िगरेशन

यदि आपके आवेदन में Redis सर्वर क्लस्टर का उपयोग किया जाता है, तो आपको Redis कॉन्फ़िगरेशन फ़ाइल में clusters कुंजी का उपयोग करके इन क्लस्टरों को परिभाषित करना चाहिए:

return [
    'clusters' => [
        'default' => [
            [
                'host'     => 'localhost',
                'password' => null,
                'port'     => 6379,
                'database' => 0,
            ],
        ],
    ],

];

डिफ़ॉल्ट रूप से, क्लस्टर नोड्स पर क्लाइंट विभाजन को लागू कर सकते हैं, जो आपको नोड पूल को लागू करने और बड़ी मात्रा में उपलब्ध मेमोरी बनाने की अनुमति देता है। यहाँ ध्यान देने वाली बात यह है कि क्लाइंट साझा करने में असफलता की स्थिति को प्रबंधित नहीं किया जाएगा; इसलिए, यह कार्य मुख्य रूप से अन्य मुख्य डेटाबेस से प्राप्त कैश डेटा के लिए उपयुक्त है। यदि आप Redis का मूल क्लस्टर उपयोग करना चाहते हैं, तो आपको कॉन्फ़िगरेशन फ़ाइल के नीचे options कुंजी में निम्नलिखित निर्दिष्ट करना होगा:

return[
    'options' => [
        'cluster' => 'redis',
    ],

    'clusters' => [
        // ...
    ],
];

पाइपलाइन कमांड

जब आपको एक ऑपरेशन में सर्वर को कई कमांड भेजने की आवश्यकता हो, तो आपको पाइपलाइन कमांड का उपयोग करने की सिफारिश की जाती है। pipeline विधि एक Redis इंस्टेंस के लिए एक क्लोजर को स्वीकार करती है। आप सभी कमांड को Redis इंस्टेंस को भेज सकते हैं, और वे सभी एक ऑपरेशन में पूरी हो जाएंगी:

Redis::pipeline(function ($pipe) {
    for ($i = 0; $i < 1000; $i++) {
        $pipe->set("key:$i", $i);
    }
});