کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش Redis در لاراول

Redis

  1. مقدمه
  2. کاربرد و نحوه ی استفاده
    • pipleline کردن دستورات (ارسال دستورات از طریق خط ارتباطی)
  3. pub / sub

مقدمه

Redis در واقع یک محل ذخیره سازی open source (رایگان و منبع آزاد) قدرتمند و پیشرفته مبتنی بر کلید-مقدار می باشد. از این انبار ذخیره ی اطلاعات معمولا به عنوان یک server data structure نیز یاد می شود زیرا کلیدهای آن می توانند رشته ها، hash ها، لیست ها، set ها (مجموعه ای از رشته های نامرتب) و sorted set ها (مجموعه ای از رشته های غیرتکراری) را در خود ذخیره داشته باشند (data structure = عبارت است از یک نوع فرمت تخصصی ویژه ی سازمان دهی و ذخیره ی اطلاعات همچون آرایه، جدول، فایل و رکورد). پیش از استفاده از Redis در چارچوب نرم افزاری لاراول، لازم است پکیج predis/predis (~1.0) را از طریق Composer نصب نمایید.

تنظیمات و کانفیگ Redis

تنظیمات Redis مربوط به اپلیکیشن خود را می توانید از طریق فایل کانفیگ config/database.php مدیریت نمایید. داخل این فایل، یک آرایه به نام redis می بینید که دربردارنده ی تمامی سرویس دهندگان (server های) Redis مورد استفاده ی اپلیکیشن می باشد:

'redis' => [
    'cluster' => false,
    'default' => [
        'host'     => '127.0.0.1',
        'port'     => 6379,
        'database' => 0,
    ],
],

تنظیمات پیش فرض سرور معمولا برای منظور توسعه ی اپلیکیشن کافی می باشد. اما شما می توانید در صورت لزوم این آرایه را بر اساس محیط خود ویرایش نمایید. کافی است به هر سرور Redis یک نام تخصیص داده و سپس host (میزبان) و port (درگاه) مورد استفاده ی server را مخشص نمایید.
آپشن cluster به سرویس گیرنده ی Redis لاراول دستور می دهد تا عملیات sharding سمت کلاینت (تقسیم داده های بانکی اطلاعاتی بین چندین سرویس دهنده یا نود) را انجام دهد. این کار به شما اجازه می دهد node ها (سرورها) را با یکدیگر مشترک (pool) کرده و در نتیجه مقدار RAMقابل توجهی را فراهم نمایید. البته لازم است دقت داشته باشید که عملیات sharding در سمت کلاینت رخداد failover را مدیریت نمی کند. به عبارت بهتر این عملیات بیشتر مناسب داده هایی است که موقت ذخیره شده (cached data) و از طریق data store (مخزن یا ظرفی برای ذخیره ی ماندگار اطالاعات و مدیریت مجموعه داده ها) اصلی دیگر قابل دسترسی هستند (failover به شرایطی اطلاق می شود که در آن در اثر از کار افتادگی ناگهانی سرور، اپلیکیشن و غیره .. به سرور ذخیره یا زاپاس انتقال صورت می گیرد و سرویس دهی متوقف نمی شود).
علاوه بر آن می توانید یک آرایه ی options در تعریف connection ردیس خود ایجاد کنید که به شما امکان می دهد تا یک مجموعه client options Predis تعریف کنید.
در صورتی که سرویس دهنده ی Redis به احراز هویت (authentication) نیاز دارد، می توانید با افزودن یک آیتم تنظیم به نام password به آرایه ی تنظیمات سرور Redis، یک گذرواژه ارائه نمایید.
نکته: اگر افزونه ی Redis PHP را از طریق PECL نصب نموده اید، بایستی alias (نام مستعار) Redis را در فایل config/app.php تغییر دهید.

کاربرد و نحوه ی استفاده

می توانید با فراخوانی توابع مختلف در فاساد (facade) Redis به راحتی با Redis تعامل داشته باشید. این facade از توابع dynamic پشتیبانی می کند، بدین معنی که شما اجازه دارید هر دستوری از Redis را در facade نام برده صدا بزنید و دستور مورد نظر نیز به طور مسقیم به Redisارسال می شود. در مثال حاضر دستور GET را با فراخوانی متد get در Redis، صدا می زنیم:

<?php
namespace App\Http\Controllers;
use Redis;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        $user = Redis::get('user:profile:'.$id);
        return view('user.profile', ['user' => $user]);
    }
}

البته همان طور که در بالا نیز گفته شد می توانید هر یک از دستورات Redis را در فاساد Redis صدا بزنید. Laravel با استفاده از magic method ها (متدهایی که با دو زیرخط شروع می شوند و امکان ساخت شی یا نمونه از کلاس را بهبود می بخشند) دستورات را به سرویس دهنده یRedis پاس می دهد. بنابراین کافی است آرگومان های مورد انتظار دستور Redis را به آن ارسال کنید:

Redis::set('name', 'Taylor');
$values = Redis::lrange('names', 5, 10);

یا می توانید دستورات را به وسیله ی متد command ارسال نمایید. این متد اسم دستور مد نظر را به عنوان اولین آرگومان پذیرفته و آرایه ای از مقادیر را به عنوان آرگومان دوم دریافت می کند:

                    $values = Redis::command('lrange', ['name', 5, 10]);

استفاده از چندین Redis Connection

می توان با فراخوانیRedis::connection نمونه ای از Redis را دریافت کرد:

                    $redis = Redis::connection();

این فراخوانی نمونه ای از سرویس دهنده ی پیش فرض Redis را به عنوان خروجی در اختیار ما قرار می دهد. اگر از server clustering (خوشه بندی سرویس دهنده عبارت است از عمل کردن چندین سرویس دهنده به عنوان یک سیستم واحد جهت بهبود کارایی و بازدهی یا به عبارتی دیگر یک مجموعه نود یا سرور که با یکدیگر تعامل داشته و یک سرویس را با قابلیت دسترسی بالا به سرویس گیرنده یا کلاینت عرضه می کند) استفاده نمی کنید، در آن صورت می توانید اسم سرویس دهنده را به متد connection پاس دهید تا به سرور دلخواه (مشخص شده در تنظیمات Redis) دسترسی داشته باشید:

                    $redis = Redis::connection('other');

pipleline کردن دستورات (ارسال دستورات از طریق خط ارتباطی)

از pipelining تنها زمانی بایستی استفاده شود که لازم است تعدادی دستور را طی یک عملیات (operation) واحد به سرویس دهنده (server) ارسال کنید. متد pipeline یک آرگومان ورودی دریافت می کند: یک تابع Closure که نمونه ای از Redis را به عنوان پارامتر دریافت می کند. می توانید تمامی دستورات خود را به این نمونه ی Redis ارسال کنید. می بینید که تمامی دستورات ارسالی طی یک عملیات واحد اجرا می شوند:

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

pub / sub

Laravel یک interface (رابط) برای دستورات publish و subscribe ردیس ارائه می کند. این دو دستور به شما اجازه می دهند به پیغام های یک کانال یا "channel" معین گوش فرا دهید (pub/sub به عنوان یک مفهوم کلی یک الگوی ارسال / دریافت پیغام رسانی است که هدف آن جدا کردن طرف ارسال کننده پیغام از گیرنده آن می باشد). می توانید پیغام ها را از اپلیکیشن دیگری به کانال مورد نظر ارسال کنید یا از زبان برنامه نویسی دیگری برای ارسال پیغام استفاده کنید. این امر به شما امکان می دهد ارتباط آسان بین اپلیکیشن ها / فرایند ها برقرار نمایید.
در گام نخست از طریق Redis و به واسطه ی متد subscribe یک listener برای channel مورد نظر تنظیم می کنیم. این متد را در دستور آرتیزان فرا می خوانیم چرا که فراخوانی متد مزبور سبب راه اندازی یک فرایند طولانی می شود:

<?php
namespace App\Console\Commands;
use Redis;
use Illuminate\Console\Command;
class RedisSubscribe extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'redis:subscribe';
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Subscribe to a Redis channel';
    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        Redis::subscribe(['test-channel'], function($message) {
            echo $message;
        });
    }
}

حال با بهره گیری از تابع publish پیغام هایی را به کانال ذکر شده ارسال (publish) می کنیم:

Route::get('publish', function () {
    // Route logic...
    Redis::publish('test-channel', json_encode(['foo' => 'bar']));
});

دریافت تمامی پیغام های ارسالی به تمامی کانال ها

با استفاده از متد psubscribe، می توان به یک wildcard channel گوش فرا داده (subscribe کرده) و بدین وسیله تمامی پیغام ها را در تمامی کانال ها دریافت کنید. اسم متغیر $channel به عنوان آرگومان دوم به تابع بازفراخوان (callback) Closure فرستاده می شود:

Redis::psubscribe(['*'], function($message, $channel) {
    echo $message;
});
Redis::psubscribe(['users.*'], function($message, $channel) {
    echo $message;
});
1395/03/17 8891 1740
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...