workerman-redis
مقدمة
workeman/redis هو مكون redis غير المتزامن المعتمد على workerman.
ملاحظة
الهدف الرئيسي من هذا المشروع هو تنفيذ الاشتراك غير المتزامن (subscribe، pSubscribe) في redis.
نظرًا لأن redis سريع للغاية، فلا داعي لاستخدام هذا العميل غير المتزامن ما لم تكن بحاجة إلى الاشتراك غير المتزامن psubscribe subscribe، حيث أن استخدام توسيع redis سيحقق أداءً أفضل.
التثبيت:
composer require workerman/redis ^v2.0.3
طرق الاستدعاء
use Workerman\Worker;
use Workerman\Redis\Client;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:6161');
$worker->onWorkerStart = function() {
global $redis;
$redis = new Client('redis://127.0.0.1:6379');
};
$worker->onMessage = function(TcpConnection $connection, $data) {
global $redis;
$redis->set('key', 'hello world');
$redis->get('key', function ($result) use ($connection) {
$connection->send($result);
});
};
Worker::runAll();
استخدام التزامن
ملاحظة
يتطلب استخدام التزامن workerman>=5.0، workerman/redis>=2.0.0 وتثبيت composer require revolt/event-loop ^1.0.0
use Workerman\Worker;
use Workerman\Redis\Client;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:6161');
$worker->onWorkerStart = function() {
global $redis;
$redis = new Client('redis://127.0.0.1:6379');
};
$worker->onMessage = function(TcpConnection $connection, $data) {
global $redis;
$redis->set('key', 'hello world');
$result = $redis->get('key');
$connection->send($result);
};
Worker::runAll();
عندما لا يتم تعيين دالة استدعاء، سيقوم العميل بإرجاع نتيجة الطلب غير المتزامن بطريقة متزامنة، ولن يعيق عملية الطلب الحالية، مما يعني أنه يمكن معالجة الطلبات بشكل متزامن.
ملاحظة
psubscribe subscribe لا يدعم استخدام التزامن
الوثائق
تفاصيل
في طريقة الاستدعاء، تحتوي دالة الاستدعاء عمومًا على معلمين ($result، $redis)، حيث $result هو النتيجة، و$redis هو مثيل redis. على سبيل المثال:
use Workerman\Redis\Client;
$redis = new Client('redis://127.0.0.1:6379');
// تعيين دالة الاستدعاء للتحقق من نتيجة استدعاء set
$redis->set('key', 'value', function ($result, $redis) {
var_dump($result); // true
});
// لا تكون دالة الاستدعاء إلزامية؛ هنا تم إغفال دالة الاستدعاء
$redis->set('key1', 'value1');
// يمكن أن تتداخل دالة الاستدعاء
$redis->get('key', function ($result, $redis){
$redis->set('key2', 'value2', function ($result) {
var_dump($result);
});
});
الاتصال
use Workerman\Redis\Client;
// إغفال دالة الاستدعاء
$redis = new Client('redis://127.0.0.1:6379');
// مع دالة استدعاء
$redis = new Client('redis://127.0.0.1:6379', [
'connect_timeout' => 10 // تعيين مهلة الاتصال 10 ثوانٍ، إذا لم يتم تعيينها ستكون 5 ثوانٍ افتراضية
], function ($success, $redis) {
// دالة استدعاء نتيجة الاتصال
if (!$success) echo $redis->error();
});
التوثيق
// التوثيق عبر كلمة المرور
$redis->auth('password', function ($result) {
});
// التوثيق عبر اسم المستخدم وكلمة المرور
$redis->auth('username', 'password', function ($result) {
});
pSubscribe
قم بالاشتراك في قناة واحدة أو أكثر تتوافق مع أنماط معينة.
كل نمط يستخدم كعلامة مطابقة، على سبيل المثال it يتوافق مع جميع القنوات التي تبدأ بـ it ( it.news ، it.blog ، it.tweets، وهكذا). news.* يتوافق مع جميع القنوات التي تبدأ بـ news. ( news.it ، news.global.today، وهكذا)، وما إلى ذلك.
ملاحظة: تحتوي دالة الاستدعاء لـ pSubscribe على 4 معاملات ($pattern، $channel، $message، $redis)
عند استدعاء مثيل $redis لـ pSubscribe أو subscribe، سيتم تجاهل أي طرق أخرى يتم استدعاؤها على نفس المثيل.
$redis = new Client('redis://127.0.0.1:6379');
$redis2 = new Client('redis://127.0.0.1:6379');
$redis->psubscribe(['news*', 'blog*'], function ($pattern, $channel, $message) {
echo "$pattern, $channel, $message"; // news*, news.add, محتوى الأخبار
});
Timer::add(5, function () use ($redis2){
$redis2->publish('news.add', 'محتوى الأخبار');
});
subscribe
يستخدم للاشتراك في معلومات قناة واحدة أو أكثر محددة.
ملاحظة: تحتوي دالة الاستدعاء لـ subscribe على 3 معاملات ($channel، $message، $redis)
عند استدعاء مثيل $redis لـ pSubscribe أو subscribe، سيتم تجاهل أي طرق أخرى يتم استدعاؤها على نفس المثيل.
$redis = new Client('redis://127.0.0.1:6379');
$redis2 = new Client('redis://127.0.0.1:6379');
$redis->subscribe(['news', 'blog'], function ($channel, $message) {
echo "$channel, $message"; // news, محتوى الأخبار
});
Timer::add(5, function () use ($redis2){
$redis2->publish('news', 'محتوى الأخبار');
});
publish
يستخدم لإرسال المعلومات إلى القناة المحددة.
يُرجع عدد المشتركين الذين تلقوا المعلومات.
$redis2->publish('news', 'محتوى الأخبار');
select
// إغفال دالة الاستدعاء
$redis->select(2);
$redis->select('test', function ($result, $redis) {
// يجب أن يكون معلمة select رقمًا، لذا سيكون $result هنا false
var_dump($result, $redis->error());
});
get
أمر يستخدم للحصول على قيمة المفتاح المحدد. إذا لم يكن المفتاح موجودًا، يُرجع NULL. إذا كانت القيمة المخزنة في المفتاح ليست من نوع سلسلة، يُرجع false.
$redis->get('key', function($result) {
// إذا لم يكن المفتاح موجوداً، يُرجع NULL، إذا حدث خطأ، يُرجع false
var_dump($result);
});
set
يستخدم لتعيين قيمة معينة للمفتاح المحدد. إذا كان المفتاح قد تم تخزين قيمة أخرى، فستقوم SET بكتابة القيمة القديمة، متجاهلةً النوع.
$redis->set('key', 'value');
$redis->set('key', 'value', function($result){});
// يمكن تمرير مدة انتهاء الصلاحية كمعلمة ثالثة، تنتهي بعد 10 ثوانٍ
$redis->set('key','value', 10);
$redis->set('key','value', 10, function($result){});
setEx، pSetEx
لتعيين قيمة المفتاح المحدد ومدة انتهاء صلاحية. إذا كان المفتاح موجودًا بالفعل، فستقوم SETEX باستبدال القيمة القديمة.
// ملاحظة: يتم تمرير مدة انتهاء الصلاحية كمعلمة ثانية، الوحدة بالثواني
$redis->setEx('key', 3600, 'value');
// pSetEx الوحدة بالمللي ثانية
$redis->pSetEx('key', 3600, 'value');
del
يستخدم لحذف المفتاح الموجود، والنتيجة تكون رقمًا تمثل عدد المفاتيح المحذوفة (لا يتم احتساب المفاتيح غير الموجودة).
// حذف مفتاح واحد
$redis->del('key');
// حذف مفاتيح متعددة
$redis->del(['key', 'key1', 'key2']);
setNx
( SETifNot eXists ) يقوم هذا الأمر بتعيين القيمة المحددة للمفتاح إذا لم يكن موجودًا.
$redis->del('key');
$redis->setNx('key', 'value', function($result){
var_dump($result); // 1
});
$redis->setNx('key', 'value', function($result){
var_dump($result); // 0
});
exists
يستخدم الأمر للتحقق مما إذا كان المفتاح المعطى موجودًا. يكون الناتج رقمًا يمثل عدد المفاتيح الموجودة.
$redis->set('key', 'value');
$redis->exists('key', function ($result) {
var_dump($result); // 1
});
$redis->exists('NonExistingKey', function ($result) {
var_dump($result); // 0
});
$redis->mset(['foo' => 'foo', 'bar' => 'bar', 'baz' => 'baz']);
$redis->exists(['foo', 'bar', 'baz'], function ($result) {
var_dump($result); // 3
});
incr، incrBy
يضيف 1 / القيمة المحددة إلى القيمة المخزنة في المفتاح. إذا لم يكن المفتاح موجودًا، فسيتم تهيئة قيمة المفتاح إلى 0، ثم يتم تنفيذ عملية incr / incrBy.
إذا كانت القيمة تحتوي على نوع خاطئ، أو قيمة من نوع سلسلة لا يمكن تمثيلها كرقم، فسيتم إرجاع false.
إذا نجحت العملية، يتم إرجاع القيمة الجديدة.
$redis->incr('key1', function ($result) {
var_dump($result);
});
$redis->incrBy('key1', 10, function ($result) {
var_dump($result);
});
incrByFloat
يزيد القيمة المخزنة في المفتاح بمقدار محدد من عدد الفواصل العشرية. إذا لم يكن المفتاح موجودًا، فسيقوم INCRBYFLOAT أولاً بتعيين قيمة المفتاح إلى 0، ثم يتم تنفيذ عملية الجمع.
إذا كانت القيمة تحتوي على نوع خاطئ، أو قيمة من نوع سلسلة لا يمكن تمثيلها كرقم، فسيتم إرجاع false.
إذا نجحت العملية، يتم إرجاع القيمة الجديدة.
$redis->incrByFloat('key1', 1.5, function ($result) {
var_dump($result);
});
decr، decrBy
يقوم الأمر بإنقاص القيمة المخزنة في المفتاح بمقدار 1 / المقدار المحدد. إذا لم يكن المفتاح موجودًا، فيتم تهيئة القيمة عند 0، ثم يتم تنفيذ عملية decr / decrBy.
إذا كانت القيمة تحتوي على نوع خاطئ، أو قيمة من نوع سلسلة لا يمكن تمثيلها كرقم، فسيتم إرجاع false.
إذا نجحت العملية، يتم إرجاع القيمة الجديدة.
$redis->decr('key1', function ($result) {
var_dump($result);
});
$redis->decrBy('key1', 10, function ($result) {
var_dump($result);
});
mGet
يرجع جميع القيم للمفاتيح المعطاة. إذا كان هناك مفتاح معين لا يوجد، فسيتم إرجاع NULL لذلك المفتاح.
$redis->set('key1', 'value1');
$redis->set('key2', 'value2');
$redis->set('key3', 'value3');
$redis->mGet(['key0', 'key1', 'key5'], function ($result) {
var_dump($result); // [null, 'value1', null];
});
getSet
يستخدم لتعيين قيمة المفتاح المحدد، وإرجاع القيمة القديمة للمفتاح.
$redis->set('x', '42');
$redis->getSet('x', 'lol', function ($result) {
var_dump($result); // '42'
}) ;
$redis->get('x', function ($result) {
var_dump($result); // 'lol'
}) ;
randomKey
يُرجع مفتاحًا عشوائيًا من قاعدة البيانات الحالية.
$redis->randomKey(function($key) use ($redis) {
$redis->get($key, function ($result) {
var_dump($result);
}) ;
})
move
يُعيد المفتاح من قاعدة البيانات الحالية إلى قاعدة البيانات المعطاة db.
$redis->select(0); // التحويل إلى DB 0
$redis->set('x', '42'); // كتابة 42 في x
$redis->move('x', 1, function ($result) { // التحويل إلى DB 1
var_dump($result); // 1
}) ;
$redis->select(1); // التحويل إلى DB 1
$redis->get('x', function ($result) {
var_dump($result); // '42'
}) ;
rename
يغير اسم المفتاح، إذا كان المفتاح غير موجود، يُرجع false.
$redis->set('x', '42');
$redis->rename('x', 'y', function ($result) {
var_dump($result); // true
}) ;
renameNx
يُغير اسم المفتاح إذا لم يكن المفتاح الجديد موجودًا.
$redis->del('y');
$redis->set('x', '42');
$redis->renameNx('x', 'y', function ($result) {
var_dump($result); // 1
}) ;
expire
يُعين مدة انتهاء الصلاحية للمفتاح، بعد انتهاء مدة الصلاحية، لن يصبح المفتاح متاحًا. الوحدة بالثواني. إذا تم إزالة المدة بنجاح، يتم إرجاع 1. إذا كان المفتاح غير موجود أو لا توجد مدة انتهاء، يتم إرجاع 0. إذا حدث خطأ، يتم إرجاع false.
$redis->set('x', '42');
$redis->expire('x', 3);
keys
يستخدم الأمر للعثور على جميع المفاتيح التي تتوافق مع نمط معين.
$redis->keys('*', function ($keys) {
var_dump($keys);
}) ;
$redis->keys('user*', function ($keys) {
var_dump($keys);
}) ;
type
يُرجع نوع القيمة المخزنة في المفتاح. الناتج هو سلسلة واحدة من بين string set list zset hash none، حيث none تعني عدم وجود المفتاح.
$redis->type('key', function ($result) {
var_dump($result); // string set list zset hash none
}) ;
append
إذا كان المفتاح موجودًا بالفعل وهو سلسلة، فإن أمر APPEND سيضيف القيمة إلى نهاية القيمة الأصلية للمفتاح، ويرجع طول السلسلة.
إذا لم يكن المفتاح موجودًا، سيقوم APPEND ببساطة بتعيين القيمة المحددة للمفتاح كما يفعل مع أمر SET key value، ويعيد طول السلسلة.
إذا كان المفتاح موجودًا لكنه ليس سلسلة، فإنه يرجع false.
$redis->set('key', 'value1');
$redis->append('key', 'value2', function ($result) {
var_dump($result); // 12
}) ;
$redis->get('key', function ($result) {
var_dump($result); // 'value1value2'
}) ;
getRange
يُحصل على جزء من السلسلة المخزنة في المفتاح المحدد. يتم تحديد مدى القطع بواسطة انزلاقين start و end (بما في ذلك start و end). إذا لم يكن المفتاح موجودًا، يُرجع سلسلة فارغة. إذا لم يكن المفتاح من نوع سلسلة، يُرجع false.
$redis->set('key', 'string value');
$redis->getRange('key', 0, 5, function ($result) {
var_dump($result); // 'string'
}) ;
$redis->getRange('key', -5, -1 , function ($result) {
var_dump($result); // 'value'
}) ;
setRange
يستخدم لتجاوز قيمة السلسلة المخزنة في المفتاح المحدد من خلال سلسلة معينة، يبدأ التجاوز من انزلاق offset. إذا لم يكن المفتاح موجودًا، يتم تعيين المفتاح بذات السلسلة المحددة. إذا لم يكن المفتاح من نوع سلسلة، يُرجع false.
الناتج هو الطول المعدل للسلسلة.
$redis->set('key', 'Hello world');
$redis->setRange('key', 6, "redis", function ($result) {
var_dump($result); // 11
}) ;
$redis->get('key', function ($result) {
var_dump($result); // 'Hello redis'
}) ;
strLen
يُحصل على طول القيمة المخزنة في المفتاح المحدد. إذا كانت القيمة تخزّن نوعًا غير سلسلة، يُرجع false.
$redis->set('key', 'value');
$redis->strlen('key', function ($result) {
var_dump($result); // 5
}) ;
getBit
للحصول على البت المحدد في القيمة المخزنة في المفتاح.
$redis->set('key', "\x7f"); // هذا هو 0111 1111
$redis->getBit('key', 0, function ($result) {
var_dump($result); // 0
}) ;
setBit
لتعيين أو مسح البت المحدد في القيمة المخزنة في المفتاح.
القيمة المرتجعة هي 0 أو 1، وتعكس القيمة قبل التعديل.
$redis->set('key', "*"); // ord("*") = 42 = 0x2f = "0010 1010"
$redis->setBit('key', 5, 1, function ($result) {
var_dump($result); // 0
}) ;
bitOp
يتم تنفيذ العمليات البتية بين عدة مفاتيح (تتضمن قيم سلسلة) وتخزين النتائج في مفتاح الهدف.
أمر BITOP يدعم أربع عمليات بتية: AND، OR، XOR و NOT.
الناتج يُخزن في حجم السلسلة في مفتاح الهدف، والذي يساوي حجم أطول سلسلة إدخال.
$redis->set('key1', "abc");
$redis->bitOp('AND', 'dst', 'key1', 'key2', function ($result) {
var_dump($result); // 3
}) ;
bitCount
يُحصل على عدد البتات المضبوطة (عدد السكان) في السلسلة.
بشكل افتراضي، سيتم فحص جميع البايت الموجودة في السلسلة. يمكن تحديد عمليات العد داخل فترة عبر المعلمات الإضافية start و end.
مثل أمر GETRANGE، يمكن أن تحتوي القيم ابتداءً وانطلاقًا على قيم سالبة لتسهيل العد من نهاية السلسلة، حيث يشير -1 إلى آخر بايت، و -2 إلى البايت قبل الأخير، وهكذا.
سترجع نتيجة الأمر عدد القيم 1 في السلسلة.
المفاتيح غير الموجودة تُعتبر سلسلًة فارغة، لذا سيتم إرجاع صفر.
$redis->set('key', 'hello');
$redis->bitCount('key', 0, 0, function ($result) {
var_dump($result); // 3
}) ;
$redis->bitCount('key', function ($result) {
var_dump($result); // 21
}) ;
sort
يمكن لأمر sort ترتيب عناصر القائمة، المجموعة، ومجموعة مرتبة.
النموذج: sort($key, $options, $callback);
حيث options هي مفاتيح وقيم اختيارية التالية
$options = [
'by' => 'some_pattern_*',
'limit' => [0, 1],
'get' => 'some_other_pattern_*', // أو مصفوفة من الأنماط
'sort' => 'asc', // أو 'desc'
'alpha' => true,
'store' => 'external-key'
];
$redis->del('s');
$redis->sAdd('s', 5);
$redis->sAdd('s', 4);
$redis->sAdd('s', 2);
$redis->sAdd('s', 1);
$redis->sAdd('s', 3);
$redis->sort('s', [], function ($result) {
var_dump($result); // 1,2,3,4,5
});
$redis->sort('s', ['sort' => 'desc'], function ($result) {
var_dump($result); // 5,4,3,2,1
});
$redis->sort('s', ['sort' => 'desc', 'store' => 'out'], function ($result) {
var_dump($result); // (int)5
});
ttl، pttl
يُرجع الوقت المتبقي لانتهاء صلاحيته بالمفتاح، بالثواني / الميلي ثانية.
إذا لم يكن للمفتاح ttl، يتم إرجاع -1. إذا لم يكن المفتاح موجودًا، يتم إرجاع -2.
$redis->set('key', 'value', 10);
// الثواني
$redis->ttl('key', function ($result) {
var_dump($result); // 10
});
// الميلي ثانية
$redis->pttl('key', function ($result) {
var_dump($result); // 9999
});
// المفتاح غير موجود
$redis->pttl('key-not-exists', function ($result) {
var_dump($result); // -2
});
persist
يزيل مدة انتهاء الصلاحية من المفتاح المعطى، مما يجعله دائمًا غير منتهي.
إذا تمت إزالة المدة بنجاح، يُرجع 1. إذا كان المفتاح غير موجود أو ليس لديه مدة انتهاء، يُرجع 0. إذا حدث خطأ، يُرجع false.
$redis->persist('key');
mSet، mSetNx
تعيين أزواج مفاتيح وقيم متعددة في أمر ذري. يُرجع mSetNx 1 فقط إذا تم تعيين جميع المفاتيح.
تكون النتيجة هي 1 عند النجاح، 0 عند الفشل، و false عند وقوع خطأ.
$redis->mSet(['key0' => 'value0', 'key1' => 'value1']);
hSet
عين قيمة حقل في الجدول الهش.
إذا كانت الحقل جديدة في الجدول الهش وتم ضبط القيمة بنجاح، يُرجع 1. إذا كان حقل الجدول الهش موجودًا بالفعل وتم تغطيته بالقيمة الجديدة، يُرجع 0.
$redis->del('h');
$redis->hSet('h', 'key1', 'hello', function ($r) {
var_dump($r); // 1
});
$redis->hGet('h', 'key1', function ($r) {
var_dump($r); // hello
});
$redis->hSet('h', 'key1', 'plop', function ($r) {
var_dump($r); // 0
});
$redis->hGet('h', 'key1', function ($r) {
var_dump($r); // plop
});
hSetNx
عين قيمة حقل غير موجود في الجدول الهش.
إذا لم يكن الجدول الهش موجودًا، سيتم إنشاء جدول هاش جديد وإجراء عملية HSET.
إذا كان الحقل موجودًا بالفعل في الجدول الهش، تكون العملية غير صالحة.
إذا كان المفتاح غير موجود، سيتم إنشاء جدول هاش جديد وإجراء أمر HSETNX.
$redis->del('h');
$redis->hSetNx('h', 'key1', 'hello', function ($r) {
var_dump($r); // 1
});
$redis->hSetNx('h', 'key1', 'world', function ($r) {
var_dump($r); // 0
});
hGet
يرجع القيمة لحقل محدد في الجدول الهش.
إذا كان الحقل المعطى أو المفتاح غير موجود، يُرجع null.
$redis->hGet('h', 'key1', function ($result) {
var_dump($result);
});
hLen
يستخدم للحصول على عدد الحقول في الجدول الهش.
عندما لا يكون المفتاح موجودًا، يُرجع 0.
$redis->del('h');
$redis->hSet('h', 'key1', 'hello');
$redis->hSet('h', 'key2', 'plop');
$redis->hLen('h', function ($result) {
var_dump($result); // 2
});
hDel
يستخدم الأمر لحذف حقل أو أكثر محددة في الجدول الهش، الحقول غير الموجودة يتم تجاهلها.
يرجع عدد الحقول التي تم حذفها بنجاح، بدون الحقول التي تم تجاهلها. إذا لم يكن المفتاح نوعًا هاشًا، فيرجع false.
$redis->hDel('h', 'key1');
hKeys
يُحصل على جميع الحقول في الجدول الهش على هيئة مصفوفة.
إذا لم يكن المفتاح موجودًا، يُرجع مصفوفة فارغة. إذا لم يكن المفتاح من نوع هاش، فيرجع false.
$redis->hKeys('key', function ($result) {
var_dump($result);
});
hVals
يرجع جميع القيم للحقول في الجدول الهش على هيئة مصفوفة.
إذا لم يكن المفتاح موجودًا، يُرجع مصفوفة فارغة. إذا لم يكن المفتاح من نوع هاش، فيرجع false.
$redis->hVals('key', function ($result) {
var_dump($result);
});
hGetAll
يرجع جميع الحقول والقيم في الجدول الهش على هيئة مصفوفة مرتبطة.
إذا لم يكن المفتاح موجودًا، يُرجع مصفوفة فارغة. إذا لم يكن المفتاح من نوع هاش، فيرجع false.
$redis->del('h');
$redis->hSet('h', 'a', 'x');
$redis->hSet('h', 'b', 'y');
$redis->hSet('h', 'c', 'z');
$redis->hSet('h', 'd', 't');
$redis->hGetAll('h', function ($result) {
var_export($result);
});
النتيجة
array (
'a' => 'x',
'b' => 'y',
'c' => 'z',
'd' => 't',
)
hExists
للتحقق مما إذا كان حقل محدد موجودًا في الجدول الهش. إذا كان موجودًا يُرجع 1، إذا كان الحقل غير موجود أو المفتاح غير موجود يُرجع 0، إذا حدث خطأ يُرجع false.
$redis->hExists('h', 'a', function ($result) {
var_dump($result); //
});
hIncrBy
يستخدم لإضافة قيمة محددة إلى قيمة الحقل في الجدول الهش.
يمكن أن تكون القيمة زيادة سلبية، مما يعني أنها إجراء طرح على الحقل المحدد.
إذا لم يكن المفتاح الخاص بالجدول الهش موجودًا، سيتم إنشاء جدول هاش جديد وإجراء أمر HINCRBY.
إذا لم يكن الحقل المعطى موجودًا، سيتم تهيئة قيمة الحقل إلى 0 قبل تنفيذ الأمر.
ستقوم عملية HINCRBY المرتبطة بحقل مخزن بقيمة سلسلة بإرجاع false.
تقتصر القيمة على تمثيل رقم صحيح موقّع لـ 64 بت.
$redis->del('h');
$redis->hIncrBy('h', 'x', 2, function ($result) {
var_dump($result);
});
hIncrByFloat
مثل hIncrBy، إلا أن الزيادة من نوع فواصل.
hMSet
يمكن من تعيين عدة أزواج (حقل-قيمة) إلى الجدول الهش في نفس الوقت.
هذا الأمر سيغطي الحقول الموجودة في الجدول الهش.
إذا لم يكن الجدول الهش موجودًا، سيتم إنشاء جدول هاش فارغ وسيتم إجراء عملية HMSET.
$redis->del('h');
$redis->hMSet('h', ['name' => 'Joe', 'sex' => 1])
hMGet
يرجع الحقول والمعطيات في الجدول الهش ذات الصلة على هيئة مصفوفة مرتبطة.
إذا لم يكن الحقل المعطى موجودًا في الجدول الهش، سيكون القيمة المرتبطة الخاصة به null. إذا لم يكن المفتاح من نوع هاش، سيُرجع false.
$redis->del('h');
$redis->hSet('h', 'field1', 'value1');
$redis->hSet('h', 'field2', 'value2');
$redis->hMGet('h', ['field1', 'field2', 'field3'], function ($r) {
var_export($r);
});
الناتج
array (
'field1' => 'value1',
'field2' => 'value2',
'field3' => null
)
blPop، brPop
قم بإزالة والحصول على العنصر الأول / الأخير في القائمة، إذا لم يكن هناك عناصر في القائمة، سيقوم بتعطيل القائمة حتى انتهاء المهلة أو العثور على عنصر يمكن إزالته.
$redis = new Client('redis://127.0.0.1:6379');
$redis2 = new Client('redis://127.0.0.1:6379');
$redis->blPop(['key1', 'key2'], 10, function ($r) {
var_export($r); // array ( 0 => 'key1',1 => 'a')
});
Timer::add(1, function () use ($redis2) {
$redis2->lpush('key1', 'a');
});
bRPopLPush
إزالة العنصر الأخير من القائمة وأضف ذلك العنصر إلى بداية قائمة أخرى؛ إذا لم يكن هناك أي عناصر في القائمة، ستقوم بتعطيل القائمة حتى انتهاء المهلة أو العثور على عنصر يمكن إزالته. إذا انتهت فترة الانتظار، يُرجع null.
$redis = new Client('redis://127.0.0.1:6379');
$redis2 = new Client('redis://127.0.0.1:6379');
$redis->del(['key1', 'key2']);
$redis->bRPopLPush('key1', 'key2', 2, function ($r) {
var_export($r);
});
Timer::add(2, function () use ($redis2) {
$redis2->lpush('key1', 'a');
$redis2->lRange('key2', 0, -1, function ($r) {
var_dump($r);
});
}, null, false);
lIndex
يستخدم لاسترداد العنصر من القائمة وفقًا للفهرس. يمكنك أيضًا استخدام الفهارس السلبية، حيث يشير -1 إلى العنصر الأخير في القائمة، و -2 يشير إلى العنصر الثاني من الأخير، وهكذا.
إذا كانت قيمة الفهرس المحددة خارج نطاق القائمة، يُرجع null. إذا لم يكن المفتاح من نوع قائمة، فيُرجع false.
$redis->del('key1']);
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->lindex('key1', 0, function ($r) {
var_dump($r); // A
});
lInsert
قم بإدراج عنصر قبل أو بعد عنصر موجود في القائمة. عند عدم وجود العنصر المحدد في القائمة، لا يتم اتخاذ أي إجراء.
عند عدم وجود القائمة، سيتم اعتبارها كقائمة فارغة، ولا يتم اتخاذ أي إجراء.
إذا لم يكن المفتاح من نوع قائمة، فسيُرجع false.
$redis->del('key1');
$redis->lInsert('key1', 'after', 'A', 'X', function ($r) {
var_dump($r); // 0
});
$redis->lPush('key1', 'A');
$redis->lPush('key1', 'B');
$redis->lPush('key1', 'C');
$redis->lInsert('key1', 'before', 'C', 'X', function ($r) {
var_dump($r); // 4
});
$redis->lRange('key1', 0, -1, function ($r) {
var_dump($r); // ['A', 'B', 'X', 'C']
});
lPop
قم بإزالة وإرجاع العنصر الأول في القائمة.
عندما لا يكون مفتاح القائمة موجودًا، يتم إرجاع null.
$redis->del('key1');
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->lPop('key1', function ($r) {
var_dump($r); // A
});
lPush
قم بإدراج قيمة واحدة أو أكثر في رأس القائمة. إذا لم يكن المفتاح موجودًا، سيتم إنشاء قائمة فارغة وسيتم تنفيذ عملية LPUSH. عندما يكون المفتاح موجودًا لكنه ليس من نوع القائمة، يُرجع false.
ملاحظة: في إصدارة Redis 2.4 السابقة، كانت أوامر LPUSH تقبل قيمة واحدة فقط.
$redis->del('key1');
$redis->lPush('key1', 'A');
$redis->lPush('key1', ['B','C']);
$redis->lRange('key1', 0, -1, function ($r) {
var_dump($r); // ['C', 'B', 'A']
});
lPushx
يقوم بإدراج قيمة في رأس القائمة الموجودة، إذا لم تكن القائمة موجودة، لا تنجح العملية ويرجع 0. إذا لم يكن المفتاح من نوع قائمة، يُرجع false.
القيمة المرتجعة هي الطول بعد تنفيذ الأمر lPushx.
$redis->del('key1');
$redis->lPush('key1', 'A');
$redis->lPushx('key1', ['B','C'], function ($r) {
var_dump($r); // 3
});
$redis->lRange('key1', 0, -1, function ($r) {
var_dump($r); // ['C', 'B', 'A']
});
lRange
يرجع العناصر ضمن النطاق المحدد في القائمة، يُحدد النطاق بواسطة المتغيرين START و END. حيث 0 تعني أول عنصر في القائمة، 1 تعني العنصر الثاني في القائمة، وهكذا. يمكنك أيضًا استخدام الفهارس السلبية، -1 تعني العنصر الأخير، -2 تعني العنصر الثاني من الأخير، وهكذا.
يرجع مصفوفة تحتوي على العناصر ضمن النطاق المحدد. إذا لم يكن المفتاح من نوع قائمة، يُرجع false.
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lRange('key1', 0, -1, function ($r) {
var_dump($r); // ['C', 'B', 'A']
});
lRem
استنادًا إلى قيمة المعلمة COUNT، قم بإزالة العناصر في القائمة التي تتطابق مع قيمة المعلمة VALUE.
يمكن أن تكون قيم COUNT كما يلي:
- count > 0 : ابدأ من الرأس إلى الذيل، وقم بإزالة العناصر التي تتطابق مع VALUE، بعدد COUNT.
- count < 0 : ابدأ من الذيل إلى الرأس، وقم بإزالة العناصر التي تتطابق مع VALUE، بعدد COUNT المطلق.
- count = 0 : أزل جميع القيم المتطابقة مع VALUE في القائمة.
يرجع عدد العناصر التي تمت إزالتها. إذا كانت القائمة غير موجودة، فإنها تُرجع 0. إذا كان المفتاح ليس من نوع قائمة، فإنه يرجع false.
$redis->lRem('key1', 2, 'A', function ($r) {
var_dump($r);
});
lSet
قم بتعيين قيمة للعنصر وفقًا للفهرس.
يرجع true عند النجاح، وإذا تجاوزت قيمة الفهرس النطاق أو تم تنفيذ LSET على قائمة فارغة، يُرجع false.
$redis->lSet('key1', 0, 'X');
lTrim
يستخدم لقص (trim) القائمة، مما يعني أنه يحتفظ فقط بالعناصر ضمن النطاق المحدد، وتُحذف العناصر التي ليست ضمن النطاق المحدد.
يشير الفهرس 0 إلى أول عنصر في القائمة، بينما يشير 1 إلى العنصر الثاني، وهكذا. يمكنك أيضًا استخدام الفهارس السلبية، و -1 تعني آخر عنصر في القائمة، و -2 تعني العنصر قبل الأخير، وهكذا.
يرجع true عند النجاح، ويفشل عند ترجع false.
$redis->del('key1');
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lRange('key1', 0, -1, function ($r) {
var_dump($r); // ['A', 'B', 'C']
});
$redis->lTrim('key1', 0, 1);
$redis->lRange('key1', 0, -1, function ($r) {
var_dump($r); // ['A', 'B']
});
rPop
يستخدم لإزالة آخر عنصر في القائمة، تكون القيمة هي العنصر الذي تمت إزالته.
عندما لا تكون القائمة موجودة، يُرجع null.
$redis->rPop('key1', function ($r) {
var_dump($r);
});
rPopLPush
يقوم بإزالة آخر عنصر في القائمة ويضيف ذلك العنصر إلى قائمة أخرى ويعيده.
$redis->del('x', 'y');
$redis->lPush('x', 'abc');
$redis->lPush('x', 'def');
$redis->lPush('y', '123');
$redis->lPush('y', '456');
$redis->rPopLPush('x', 'y', function ($r) {
var_dump($r); // abc
});
$redis->lRange('x', 0, -1, function ($r) {
var_dump($r); // ['def']
});
$redis->lRange('y', 0, -1, function ($r) {
var_dump($r); // ['abc', '456', '123']
});
rPush
يقوم بإدراج قيمة واحدة أو أكثر في نهاية القائمة (الجانب الأيمن)، ويُرجع طول القائمة بعد الإدراج.
إذا كانت القائمة غير موجودة، سيتم إنشاء قائمة فارغة ويتم تنفيذ عملية RPUSH. عندما تكون القائمة موجودة ولكن لا تكون من نوع قائمة، يُرجع false.
ملاحظة: في إصدارة Redis 2.4 السابقة، كانت أوامر RPUSH تقبل قيمة واحدة فقط.
$redis->del('key1');
$redis->rPush('key1', 'A', function ($r) {
var_dump($r); // 1
});
rPushX
يقوم بإدراج قيمة في نهاية القائمة الموجودة (الجانب الأيمن) ويُرجع طول القائمة. إذا كانت القائمة غير موجودة، لا تنجح العملية، ويُرجع 0. عندما تكون القائمة موجودة لكن لا تكون من نوع قائمة، يُرجع false.
$redis->del('key1');
$redis->rPushX('key1', 'A', function ($r) {
var_dump($r); // 0
});
lLen
يُرجع طول القائمة. إذا لم يكن مفتاح القائمة موجودًا، يتم تمثيل المفتاح كقائمة فارغة، ويُرجع 0. إذا لم يكن المفتاح من نوع قائمة، يُرجع false.
$redis->del('key1');
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lLen('key1', function ($r) {
var_dump($r); // 3
});
sAdd
يُضيف عنصر أو أكثر إلى المجموعة، ويتم تجاهل عناصر الأعضاء الموجودة في المجموعة.
إذا لم تكن المجموعة موجودة، تُنشئ مجموعة يحتوي أعضاءها فقط على العناصر المضافة.
تُرجع القيمة false إذا لم يكن المفتاح من نوع مجموعة.
ملاحظة: في إصدار Redis2.4 السابق، قبلت SADD قيمة واحدة فقط.
$redis->del('key1');
$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , ['member2', 'member3'], function ($r) {
var_dump($r); // 2
});
$redis->sAdd('key1' , 'member2', function ($r) {
var_dump($r); // 0
});
sCard
يُرجع عدد العناصر في المجموعة. إذا كانت المجموعة ليست موجودة، يُرجع 0.
$redis->del('key1');
$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member3');
$redis->sCard('key1', function ($r) {
var_dump($r); // 3
});
$redis->sCard('keyX', function ($r) {
var_dump($r); // 0
});
sDiff
يُرجع الفروق بين المجموعة الأولى والمجموعات الأخرى، يمكن أيضًا اعتباره عناصر فريدة في المجموعة الأولى. لن تُعتبر مهام الجماعات غير الموجودة كفراغ.
$redis->del('s0', 's1', 's2');
$redis->sAdd('s0', '1');
$redis->sAdd('s0', '2');
$redis->sAdd('s0', '3');
$redis->sAdd('s0', '4');
$redis->sAdd('s1', '1');
$redis->sAdd('s2', '3');
$redis->sDiff(['s0', 's1', 's2'], function ($r) {
var_dump($r); // ['2', '4']
});
sDiffStore
يُخزن الفرق بين المجموعات المحددة في مجموعة معينة. إذا كانت المجموعة المحددة موجودة، سيتم تغطيتها.
$redis->del('s0', 's1', 's2');
$redis->sAdd('s0', '1');
$redis->sAdd('s0', '2');
$redis->sAdd('s0', '3');
$redis->sAdd('s0', '4');
$redis->sAdd('s1', '1');
$redis->sAdd('s2', '3');
$redis->sDiffStore('dst', ['s0', 's1', 's2'], function ($r) {
var_dump($r); // 2
});
$redis->sMembers('dst', function ($r) {
var_dump($r); // ['2', '4']
});
sInter
يُرجع تقاطع جميع المجموعات المعطاة. تُعتبر المجموعات غير الموجودة كفراغ. عند وجود مجموعة فارغة من بين المجموعات المعطاة، سيكون الناتج أيضًا فراغًا.
$redis->del('s0', 's1', 's2');
$redis->sAdd('key1', 'val1');
$redis->sAdd('key1', 'val2');
$redis->sAdd('key1', 'val3');
$redis->sAdd('key1', 'val4');
$redis->sAdd('key2', 'val3');
$redis->sAdd('key2', 'val4');
$redis->sAdd('key3', 'val3');
$redis->sAdd('key3', 'val4');
$redis->sInter(['key1', 'key2', 'key3'], function ($r) {
var_dump($r); // ['val4', 'val3']
});
sInterStore
يُخزن التقاطع بين المجموعات المحددة في مجموعة معينة ويعيد عدد عناصر المجموعة المخزنة. إذا كانت المجموعة المحددة موجودة، سيتم تغطيتها.
$redis->sAdd('key1', 'val1');
$redis->sAdd('key1', 'val2');
$redis->sAdd('key1', 'val3');
$redis->sAdd('key1', 'val4');
$redis->sAdd('key2', 'val3');
$redis->sAdd('key2', 'val4');
$redis->sAdd('key3', 'val3');
$redis->sAdd('key3', 'val4');
$redis->sInterStore('output', 'key1', 'key2', 'key3', function ($r) {
var_dump($r); // 2
});
$redis->sMembers('output', function ($r) {
var_dump($r); // ['val4', 'val3']
});
sIsMember
للتحقق مما إذا كان عنصر العضو هو عضو في المجموعة.
إذا كان عنصر العضو موجودًا في المجموعة، يُرجع 1. إذا لم يكن العنصر عضوًا في المجموعة، أو المفتاح غير موجود، يُرجع 0. إذا لم يكن المفتاح من نوع مجموعة، يرجع false.
$redis->sIsMember('key1', 'member1', function ($r) {
var_dump($r);
});
sMembers
يُرجع جميع الأعضاء في المجموعة. يُعتبر المفتاح غير الموجود كمجموعة فارغة.
$redis->sMembers('s', function ($r) {
var_dump($r);
});
sMove
يُحرك عنصر العضو المحدد من المجموعة المصدر إلى المجموعة الوجهة.
عملية SMOVE هي عملية ذرية.
إذا لم تكن المجموعة المصدر موجودة أو لا تحتوي على عنصر العضو المحدد، فلن يتم تنفيذ أمر SMOVE وسيُرجع 0. بخلاف ذلك، تتم إزالة عنصر العضو من المجموعة المصدر وإضافته إلى المجموعة الوجهة.
عندما تحتوي المجموعة الهدف على عنصر العضو، فإن أمر SMOVE يقوم ببساطة بإزالة عنصر العضو من المجموعة المصدر.
عندما لا يكون المصدر أو الوجهة من نوع مجموعة، يُرجع false.
$redis->sMove('key1', 'key2', 'member13');
sPop
يُزيل عشوائيًا عنصر واحد أو أكثر من المجموعة المحددة، ويُرجع العناصر المُزالة.
عندما تكون المجموعة غير موجودة أو فارغة، يتم إرجاع null.
$redis->del('key1');
$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member3');
$redis->sPop('key1', function ($r) {
var_dump($r); // member3
});
$redis->sAdd('key2', ['member1', 'member2', 'member3']);
$redis->sPop('key2', 3, function ($r) {
var_dump($r); // ['member1', 'member2', 'member3']
});
sRandMember
يتم استخدام أمر Redis Srandmember لإرجاع عنصر عشوائي من المجموعة.
بدءًا من إصدار Redis 2.6، يقبل أمر Srandmember معلمة اختيارية count:
- إذا كانت count عددًا إيجابيًا وأقل من مجموعة العناصر، فسيرجع الأمر مصفوفة تحتوي على العناصر count، والتي تختلف عن بعضها البعض. إذا كانت count أكبر من أو تساوي عدد العناصر في المجموعة، فسيُرجع المجموعة بأكملها.
- إذا كانت count عددًا سالبًا، سيرجع الأمر مصفوفة، قد تتكرر فيها العناصر عدة مرات، وطول المصفوفة سيكون القيمة المطلقة لـ count.
تتشابه هذه العملية مع SPOP، ولكن SPOP يُزيل العناصر العشوائية من المجموعة ويُرجعها، بينما Srandmember يُعيد فقط العناصر العشوائية دون إجراء أي تغييرات على المجموعة.
$redis->del('key1');
$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member3');
$redis->sRandMember('key1', function ($r) {
var_dump($r); // member1
});
$redis->sRandMember('key1', 2, function ($r) {
var_dump($r); // ['member1', 'member2']
});
$redis->sRandMember('key1', -100, function ($r) {
var_dump($r); // ['member1', 'member2', 'member3', 'member3', ...]
});
$redis->sRandMember('empty-set', 100, function ($r) {
var_dump($r); // []
});
$redis->sRandMember('not-a-set', 100, function ($r) {
var_dump($r); // []
});
sRem
يُزيل عنصر واحد أو أكثر من أعضاء المجموعة، وسيتم تجاهل الأعضاء غير الموجودين.
ترجع العدد الذي تم إزالته بنجاح من العناصر، بدون تجاهل العناصر.
عندما لا يكون المفتاح من نوع مجموعة، يُرجع false.
في إصدارة Redis 2.4 السابقة، كانت SREM تقبل عضوًا واحدًا فقط.
$redis->sRem('key1', ['member2', 'member3'], function ($r) {
var_dump($r);
});
sUnion
يُرجع الأمر اتحاد المجموعات المعطاة. تُعتبر المجموعات غير الموجودة كمجموعة فارغة.
$redis->sUnion(['s0', 's1', 's2'], function ($r) {
var_dump($r); // []
});
sUnionStore
يخزن اتحاد المجموعات المعطاة في مجموعة محددة ويُرجع عدد العناصر. إذا كانت الوجهة موجودة، سيتم تغطيتها.
$redis->del('s0', 's1', 's2');
$redis->sAdd('s0', '1');
$redis->sAdd('s0', '2');
$redis->sAdd('s1', '3');
$redis->sAdd('s1', '1');
$redis->sAdd('s2', '3');
$redis->sAdd('s2', '4');
$redis->sUnionStore('dst', 's0', 's1', 's2', function ($r) {
var_dump($r); // 4
});
$redis->sMembers('dst', function ($r) {
var_dump($r); // ['1', '2', '3', '4']
});