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

ইনস্টলেশনের পর পুনরায় চালু করতে হবে (রিলোড কার্যকর নয়)।

কনফিগারেশন

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 (এটা 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);
    }
});