ردیس
معرفی
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;});