نسخه:

ردیس

معرفی

Redis یک فروشگاه منبع باز و پیشرفته با ارزش کلیدی است. اغلب از آن به عنوان سرور ساختار داده یاد می شود زیرا کلیدها می توانند شامل رشته ها ، هش ها ، لیست ها ، مجموعه ها و مجموعه های مرتب شده باشند .

قبل از استفاده از Redis با لاراول، ما شما را به نصب و استفاده از پسوند PhpRedis PHP از طریق PECL تشویق می کنیم. نصب برنامه افزودنی پیچیده تر است اما ممکن است برای برنامه هایی که از Redis استفاده زیادی می کنند عملکرد بهتری داشته باشد.

همچنین، می توانید predis/predis بسته را از طریق Composer نصب کنید:

composer require predis/predis

پیکربندی

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

'redis' => [
 
'client' => env('REDIS_CLIENT', 'phpredis'),
 
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],
 
'cache' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 1),
],
 
],

پیکربندی پیش فرض سرور باید برای توسعه کافی باشد. با این حال، شما آزاد هستید که این آرایه را بر اساس محیط خود تغییر دهید. هر سرور Redis تعریف شده در فایل پیکربندی شما باید نام، میزبان و پورت داشته باشد، مگر اینکه یک URL واحد برای نشان دادن اتصال Redis تعریف کنید:

'redis' => [
 
'client' => env('REDIS_CLIENT', 'phpredis'),
 
'default' => [
'url' => 'tcp://127.0.0.1:6379?database=0',
],
 
'cache' => [
'url' => 'tls://user:password@127.0.0.1:6380?database=1',
],
 
],

پیکربندی طرح اتصال

به طور پیش فرض، مشتریان Redis tcp هنگام اتصال به سرورهای Redis شما از این طرح استفاده می کنند. با این حال، می توانید با تعیین یک scheme گزینه پیکربندی در پیکربندی سرور Redis خود، از رمزگذاری TLS / SSL استفاده کنید:

'redis' => [
 
'client' => env('REDIS_CLIENT', 'phpredis'),
 
'default' => [
'scheme' => 'tls',
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],
 
],

پیکربندی خوشه ها

اگر برنامه شما از خوشه ای از سرورهای Redis استفاده می کند، باید این خوشه ها را در یک clusters کلید از پیکربندی Redis خود تعریف کنید:

'redis' => [
 
'client' => env('REDIS_CLIENT', 'phpredis'),
 
'clusters' => [
'default' => [
[
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
],
],
 
],

به‌طور پیش‌فرض، خوشه‌ها اشتراک‌گذاری سمت کلاینت را در گره‌های شما انجام می‌دهند و به شما این امکان را می‌دهند که گره‌ها را ادغام کرده و مقدار زیادی RAM در دسترس ایجاد کنید. با این حال، توجه داشته باشید که اشتراک گذاری سمت کلاینت، Failover را کنترل نمی کند. بنابراین، در درجه اول برای داده های کش که از یک فروشگاه داده اصلی دیگر در دسترس است، مناسب است. اگر می‌خواهید از خوشه‌بندی بومی Redis استفاده کنید، باید این را در options کلید پیکربندی Redis خود مشخص کنید:

'redis' => [
 
'client' => env('REDIS_CLIENT', 'phpredis'),
 
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
],
 
'clusters' => [
// ...
],
 
],

پردیس

برای استفاده از پسوند Predis، باید REDIS_CLIENT متغیر محیطی را از phpredis به predis :

'redis' => [
 
'client' => env('REDIS_CLIENT', 'predis'),
 
// Rest of Redis configuration...
],

علاوه بر گزینه‌های پیش‌فرض host ،،، و پیکربندی سرور، Predis از پارامترهای اتصال اضافی که ممکن است برای هر یک از سرورهای Redis شما تعریف شوند، پشتیبانی port می‌کند . برای استفاده از این گزینه های پیکربندی اضافی، آنها را به پیکربندی سرور Redis خود در فایل پیکربندی اضافه کنید: database password config/database.php

'default' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
'read_write_timeout' => 60,
],

PhpRedis

پسوند PhpRedis به عنوان پیش فرض در REDIS_CLIENT env و در شما پیکربندی شده است config/database.php :

'redis' => [
 
'client' => env('REDIS_CLIENT', 'phpredis'),
 
// Rest of Redis configuration...
],

اگر قصد دارید از پسوند PhpRedis همراه با Redis نام مستعار Facade استفاده کنید، باید نام آن را به چیز دیگری تغییر دهید، مانند RedisManager ، برای جلوگیری از برخورد با کلاس Redis. می توانید این کار را در بخش نام های مستعار app.php فایل پیکربندی خود انجام دهید.

'RedisManager' => Illuminate\Support\Facades\Redis::class,

علاوه بر گزینه‌های پیش‌فرض host ، و پیکربندی سرور ، PhpRedis از پارامترهای اتصال اضافی زیر پشتیبانی می‌کند port : ،،،،، و . می توانید یکی از این گزینه ها را به پیکربندی سرور Redis خود در فایل پیکربندی اضافه کنید: database password persistent prefix read_timeout timeout context config/database.php

'default' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
'read_timeout' => 60,
'context' => [
// 'auth' => ['username', 'secret'],
// 'stream' => ['verify_peer' => false],
],
],

نمای ردیس

برای جلوگیری از برخورد نام کلاس با پسوند Redis PHP، باید Illuminate\Support\Facades\Redis نام مستعار نما را از آرایه app فایل پیکربندی خود حذف یا تغییر نام دهید aliases . به طور کلی، شما باید این نام مستعار را به طور کامل حذف کنید و در حین استفاده از پسوند Redis PHP، فقط نما را با نام کلاس کاملاً واجد شرایط آن ارجاع دهید.

تعامل با Redis

می توانید با فراخوانی روش های مختلف در Redis نما با Redis تعامل کنید . نما Redis از روش های پویا پشتیبانی می کند، به این معنی که می توانید هر دستور Redis را در نما فراخوانی کنید و دستور مستقیماً به Redis ارسال می شود. GET در این مثال، دستور Redis را با فراخوانی get متد روی نما فراخوانی می کنیم Redis :

<?php
 
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Redis;
 
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 نما فراخوانی کنید. لاراول از متدهای جادویی برای ارسال دستورات به سرور Redis استفاده می کند، بنابراین آرگومان هایی را که دستور Redis انتظار دارد ارسال کنید:

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

command همچنین، می‌توانید با استفاده از روشی که نام دستور را به‌عنوان آرگومان اول و آرایه‌ای از مقادیر را به‌عنوان آرگومان دوم می‌پذیرد، دستوراتی را به سرور ارسال کنید :

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

استفاده از چندین اتصال Redis

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

$redis = Redis::connection();

این به شما یک نمونه از سرور Redis پیش فرض را می دهد. همچنین می توانید نام اتصال یا خوشه را به connection روش ارسال کنید تا یک سرور یا خوشه خاص را همانطور که در پیکربندی Redis خود تعریف شده است دریافت کنید:

$redis = Redis::connection('my-connection');

دستورات لوله کشی

زمانی که نیاز به ارسال دستورات زیادی به سرور دارید باید از خط لوله استفاده شود. متد pipeline یک آرگومان را می پذیرد: a Closure که یک نمونه Redis را دریافت می کند. شما می توانید تمام دستورات خود را به این نمونه Redis صادر کنید و همه آنها به سرور پخش می شوند و بنابراین عملکرد بهتری ارائه می دهند:

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

میخانه / فرعی

لاراول یک رابط کاربری مناسب برای Redis publish و subscribe دستورات فراهم می کند. این دستورات Redis به شما این امکان را می دهد که به پیام ها در یک "کانال" خاص گوش دهید. شما می توانید پیام هایی را از یک برنامه دیگر به کانال منتشر کنید، یا حتی با استفاده از زبان برنامه نویسی دیگر، امکان ارتباط آسان بین برنامه ها و فرآیندها را فراهم کنید.

ابتدا، بیایید یک شنونده کانال را با استفاده از subscribe روش تنظیم کنیم. ما این فراخوانی متد را در یک دستور Artisan قرار می‌دهیم زیرا فراخوانی subscribe متد یک فرآیند طولانی‌مدت را آغاز می‌کند:

<?php
 
namespace App\Console\Commands;
 
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
 
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 :

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

اشتراک های Wildcard

با استفاده از این psubscribe روش، می‌توانید مشترک یک کانال عام شوید، که ممکن است برای دریافت همه پیام‌ها در همه کانال‌ها مفید باشد. نام $channel به عنوان آرگومان دوم به callback ارائه شده ارسال می شود Closure :

Redis::psubscribe(['*'], function ($message, $channel) {
echo $message;
});
 
Redis::psubscribe(['users.*'], function ($message, $channel) {
echo $message;
});