Redis
webman/redis هو إضافة لوظيفة اتصال تجمع على أساس illuminate/redis ، ويدعم البيئات التعاونية وغير التعاونية ، والطريقة المستخدمة مشابهة للطريقة المستخدمة في laravel.
يجب تثبيت ملحق redis لـ php-cli
قبل استخدام illuminate/redis
.
ملاحظة
الدليل الحالي هو إصدار webman v2، إذا كنت تستخدم إصدار webman v1، يرجى الرجوع إلى دليل الإصدار v1
هذا المكون يتطلب تثبيت ملحق redis ، استخدم الأمرphp -m | grep redis
للتحقق مما إذا كان ملحق redis مثبتاً علىphp-cli
.
التثبيت
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 ثانية
],
]
];
حول تجمع الاتصالات
- كل عملية لديها تجمع اتصال خاص بها، ولا يتم مشاركة تجمع الاتصالات بين العمليات.
- إذا لم يتم تفعيل التعاونية، فإن العمليات تنتظر داخل العملية، ولن يحدث تزامن، لذا سيكون لدى تجمع الاتصالات اتصال واحد كحد أقصى.
- بعد تفعيل التعاونية، ستؤدى العمليات داخل العملية بشكل متزامن، وسيتكيف تجمع الاتصالات بشكل ديناميكي وفقاً للاحتياجات، بحد أقصى
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)
لتغيير قاعدة البيانات، فإنه سيؤثر على الطلبات الأخرى اللاحقة. يفضل تكوين قواعد بيانات مختلفة كمجموعات اتصال 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، يجب عليك استخدام المفتاح clusters في ملف إعدادات Redis لتعريف هذه المجموعات:
return [
'clusters' => [
'default' => [
[
'host' => 'localhost',
'password' => null,
'port' => 6379,
'database' => 0,
],
],
],
];
بشكل افتراضي، يمكن أن تقوم المجموعة بتنفيذ تقسيم العملاء على العقد، مما يسمح لك بتنفيذ تجميعات العقد وإنشاء ذاكرة متاحة بكميات كبيرة. يجب أن تكون حذراً أن مشاركة العملاء لن تتعامل مع حالات الفشل؛ لذا، فإن هذه الميزة مناسبة بشكل أكبر لبيانات التخزين المؤقت التي تم الحصول عليها من قاعدة بيانات رئيسية أخرى. إذا كنت ترغب في استخدام التجميع الأصلي لـ Redis، يتعين عليك القيام بالتحديد التالي في مفتاح options في ملف الإعدادات:
return[
'options' => [
'cluster' => 'redis',
],
'clusters' => [
// ...
],
];
أوامر الأنابيب
عندما تحتاج إلى إرسال العديد من الأوامر إلى الخادم في عملية واحدة، يُوصى باستخدام أوامر الأنابيب. تقبل طريقة pipeline closure لـ Redis instance. يمكنك إرسال جميع الأوامر إلى مثيل Redis، وسيتم تنفيذها جميعاً في عملية واحدة:
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});