workerman-redis

แนะนำ

workeman/redis เป็นส่วนประกอบ redis แบบอะซิงโครนัสที่สร้างขึ้นจาก workerman

หมายเหตุ
โครงการนี้มีวัตถุประสงค์หลักเพื่อให้บริการการสมัครสมาชิกอะซิงโครนัสกับ redis (subscribe, pSubscribe)
เนื่องจาก redis ทำงานได้รวดเร็วเพียงพอ ดังนั้นเว้นแต่คุณจะต้องการการสมัครสมาชิกอะซิงโครนัส psubscribe หรือ subscribe คุณไม่จำเป็นต้องใช้ไคลเอนต์อะซิงโครนัสนี้ การใช้ redis extension จะมีประสิทธิภาพที่ดีกว่า

การติดตั้ง:

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();

วิธีการใช้ Coroutine

หมายเหตุ
วิธีการใช้ Coroutine ต้องการ 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 ไม่รองรับการใช้ Coroutine

เอกสาร

คำอธิบาย

ในวิธีการเรียกคืนฟังก์ชันการเรียกคืนทั่วไปมี 2 พารามิเตอร์ ($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();
});

auth

// การตรวจสอบรหัสผ่าน
$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, news content
});

Timer::add(5, function () use ($redis2){
    $redis2->publish('news.add', 'news content');
});

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, news content
});

Timer::add(5, function () use ($redis2){
    $redis2->publish('news', 'news content');
});

publish

ใช้ในการส่งข้อมูลไปยังช่องที่กำหนด

คืนจำนวนผู้สมัครรับข้อมูลที่ได้รับข้อความ

$redis2->publish('news', 'news content');

select

// ละเว้นการเรียกคืน
$redis->select(2);
$redis->select('test', function ($result, $redis) {
    // พารามิเตอร์ select จะต้องเป็นตัวเลข ดังนั้นที่นี่ $result จะเป็น false
    var_dump($result, $redis->error());
});

get

คำสั่งใช้เพื่อรับค่าของ key ที่กำหนด หาก key ไม่มีอยู่จะคืนค่า NULL หากค่าที่เก็บใน key ไม่ใช่ประเภทสตริง จะส่งคืน false

$redis->get('key', function($result) {
     // หาก key ไม่อยู่ส่งคืน NULL หากเกิดข้อผิดพลาดจะคืน false
    var_dump($result);
});

set

ใช้ในการตั้งค่าค่าของ key ที่กำหนด หาก key เก็บค่าที่อื่นแล้ว 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

ตั้งค่าค่าและเวลาหมดอายุสำหรับ key ที่กำหนด หาก key มีอยู่แล้วคำสั่ง SETEX จะทำการแทนที่ค่าที่เก่าลงไป

// โปรดทราบว่าพารามิเตอร์ที่สองคือเวลาหมดอายุ หน่วยเป็นวินาที
$redis->setEx('key', 3600, 'value'); 
// pSetEx หน่วยเป็นมิลลิวินาที
$redis->pSetEx('key', 3600, 'value'); 

del

ใช้ในการลบคีย์ที่มีอยู่แล้ว ค่าผลลัพธ์จะเป็นตัวเลข แสดงถึงจำนวน k ของ key ที่ถูกลบ (key ที่ไม่มีอยู่จะไม่นับรวม)

// ลบหนึ่ง key
$redis->del('key');
// ลบหลายคีย์
$redis->del(['key', 'key1', 'key2']);

setNx

(SET if Not eXists) คำสั่งนี้จะตั้งค่าค่าที่กำหนดสำหรับ key เมื่อตัวระบุ key ไม่มีอยู่

$redis->del('key');
$redis->setNx('key', 'value', function($result){
    var_dump($result); // 1
});
$redis->setNx('key', 'value', function($result){
    var_dump($result); // 0
});

exists

คำสั่งใช้เพื่อตรวจสอบว่า key ที่กำหนดมีอยู่หรือไม่ ผลลัพธ์จะเป็นตัวเลข แสดงจำนวน key ที่มีอยู่

$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

เพิ่มค่าใน key ที่เก็บแบบตัวเลขขึ้น 1 / ค่าที่กำหนด หาก key ไม่อยู่ ค่าของ key จะถูกตั้งเป็น 0 ก่อนแล้วจึงดำเนินการเพิ่มค่าขึ้น
หากค่ามีประเภทผิด หรือค่าที่เก็บเป็นประเภทสตริงไม่สามารถแสดงออกมาเป็นตัวเลข ก็จะคืน false
หากสำเร็จจะส่งคืนค่าหมายเลขที่เพิ่มขึ้น

$redis->incr('key1', function ($result) {
    var_dump($result);
}); 
$redis->incrBy('key1', 10, function ($result) {
    var_dump($result);
}); 

incrByFloat

เพิ่มค่าที่จัดเก็บไว้ใน key ด้วยค่าทศนิยมที่กำหนดขึ้น
หาก key ไม่อยู่ คำสั่ง INCRBYFLOAT จะตั้งค่าสำหรับ key ให้เป็น 0 ก่อนดำเนินการประกอบ
หากค่าที่จัดเก็บมีประเภทผิด หรือค่าประเภทสตริงไม่สามารถแสดงออกมาเป็นตัวเลขก็จะคืน false
หากสำเร็จจะส่งคืนค่าที่เพิ่มขึ้น

$redis->incrByFloat('key1', 1.5, function ($result) {
    var_dump($result);
}); 

decr, decrBy

คำสั่งจะลดค่าใน key ที่เก็บลง 1 / ค่าที่กำหนด
หาก key ไม่อยู่ ค่าของ key จะถูกตั้งเป็น 0 ก่อนจะดำเนินการลดค่า
หากค่ามีประเภทผิด หรือค่าประเภทสตริงไม่สามารถแสดงออกมาเป็นตัวเลขก็จะคืน false
หากสำเร็จจะส่งคืนค่าที่ลดลง

$redis->decr('key1', function ($result) {
    var_dump($result);
}); 
$redis->decrBy('key1', 10, function ($result) {
    var_dump($result);
}); 

mGet

ส่งคืนค่าของ key ที่กำหนดทั้งหมด (หนึ่งหรือหลาย key) หากมี key ไหนในคีย์ที่กำหนดไม่มีอยู่ ค่าของ key นั้นจะส่งคืน 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

ใช้ในการตั้งค่าค่าของ key ที่กำหนดและส่งคืนค่าก่อนหน้า

$redis->set('x', '42');
$redis->getSet('x', 'lol', function ($result) {
    var_dump($result); // '42'
}) ;
$redis->get('x', function ($result) {
    var_dump($result); // 'lol'
}) ;

randomKey

ส่งคืน key แบบสุ่มจากฐานข้อมูลปัจจุบัน

$redis->randomKey(function($key) use ($redis) {
    $redis->get($key, function ($result) {
        var_dump($result); 
    }) ;
})

move

ย้าย key จากฐานข้อมูลปัจจุบันไปยังฐานข้อมูลที่กำหนด

$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

เปลี่ยนชื่อ key หาก key ไม่อยู่จะคืน false

$redis->set('x', '42');
$redis->rename('x', 'y', function ($result) {
    var_dump($result); // true
}) ;

renameNx

เปลี่ยนชื่อ key หาก key ใหม่ไม่มีอยู่

$redis->del('y');
$redis->set('x', '42');
$redis->renameNx('x', 'y', function ($result) {
    var_dump($result); // 1
}) ;

expire

ตั้งเวลาหมดอายุให้กับ key ค่าจะไม่สามารถใช้ได้หลังจากที่หมดอายุ โดยหน่วยเป็นวินาที คืน 1 หากสำเร็จ คืน 0 หาก key ไม่มีอยู่หรือต้องการเวลาหมดอายุ คืน false หากเกิดข้อผิดพลาด

$redis->set('x', '42');
$redis->expire('x', 3);

keys

คำสั่งใช้ในการค้นหาทุก key ที่ตรงตามรูปแบบที่กำหนด

$redis->keys('*', function ($keys) {
    var_dump($keys); 
}) ;
$redis->keys('user*', function ($keys) {
    var_dump($keys); 
}) ;

type

ส่งคืนประเภทของค่าที่จัดเก็บใน key ผลลัพธ์จะเป็นสตริง หนึ่งในค่า string, set, list, zset, hash, none โดยที่ none แสดงว่า key ไม่มีอยู่

$redis->type('key', function ($result) {
    var_dump($result); // string set list zset hash none
}) ;

append

หาก key มีอยู่แล้วและเป็นสตริง คำสั่ง APPEND จะเพิ่ม value เข้าไปที่ท้ายค่าของ key และส่งคืนความยาวของสตริง

หาก key ไม่มีอยู่ APPEND จะตั้ง key ใหม่ให้เป็น value เช่นเดียวกับการทำ SET key value และส่งคืนความยาวของสตริง

หาก key มีอยู่แต่ไม่ใช่สตริง จะส่งคืน 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

นำข้อมูลใน key ที่กำหนดมาเป็น substring ขอบเขตของสตริงจะถูกกำหนดโดย offset start และ end (รวมทั้ง start และ end) หาก key ไม่มีอยู่จะคืนสตริงว่าง หาก key ไม่ใช่ประเภทสตริง จะคืน 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

ใช้สตริงที่กำหนดซ้อนทับค่าที่จัดเก็บใน key ที่กำหนด โดยเริ่มจาก offset และหาก key ไม่มีอยู่ ค่า จะถูกตั้งให้เป็นสตริงที่กำหนด หาก key ไม่ใช่ประเภทสตริง จะส่งคืน 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

ใช้เพื่อรับความยาวของค่าที่เป็นสตริงที่จัดเก็บใน key เมื่อ key ที่เก็บไม่ได้เป็นค่าสตริงจะส่งคืน false

$redis->set('key', 'value');
$redis->strlen('key', function ($result) {
    var_dump($result); // 5
}) ; 

getBit

สำหรับค่าที่จัดเก็บใน key จะได้รับบิต (bit) ที่ตำแหน่งที่ระบุ

$redis->set('key', "\x7f"); // นี่คือ 0111 1111
$redis->getBit('key', 0, function ($result) {
    var_dump($result); // 0
}) ; 

setBit

สำหรับค่าที่จัดเก็บใน key จะตั้งค่าหรือคลายบิต ณ ตำแหน่งที่ระบุ
ค่าผลลัพธ์อยู่ที่ 0 หรือ 1 ซึ่งคือค่าก่อนที่จะแก้ไข

$redis->set('key', "*");    // ord("*") = 42 = 0x2f = "0010 1010"
$redis->setBit('key', 5, 1, function ($result) {
    var_dump($result); // 0
}) ; 

bitOp

ดำเนินการ bitwise ระหว่างหลาย key (ที่มีค่าสตริง) และเก็บผลลัพธ์ไว้ใน key เป้าหมาย

คำสั่ง BITOP รองรับการดำเนินการแบบ bitwise สี่ประเภท: AND, OR, XOR และ NOT

ค่ารายงานจะถูกเก็บใน key เป้าหมายในขนาดสตริงที่เท่ากับขนาดยาวที่สุดของสตริงขาเข้า

$redis->set('key1', "abc");
$redis->bitOp( 'AND', 'dst', 'key1', 'key2', function ($result) {
    var_dump($result); // 3
}) ;

bitCount

นับจำนวนบิตที่ตั้งไว้ในสตริง (การนับประชากร)

ตามค่าเริ่มต้น จะตรวจสอบทุกไบต์ที่มีอยู่ในสตริง สามารถระบุการนับภายในช่วงโดยการส่งพารามิเตอร์ start และ end เพิ่มเติม

เช่นเดียวกับการใช้งานคำสั่ง GETRANGE ค่าตั้งต้นและสิ้นสุดสามารถรวมค่าลบ เพื่อที่อาจจำกัดการอยู่ในไบต์จากท้ายสุดของสตริง โดยที่ -1 คือ ไบต์สุดท้าย -2 คือ ตัวอักษรที่สองจากท้ายสุด เป็นต้น

ผลลัพธ์จะส่งคืนจำนวนบิตที่มีค่าตั้งอยู่

keys ที่ไม่มีจะถือว่าเป็นสตริงว่างดังนั้นคำสั่งนี้จะส่งคืนศูนย์

$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 สามารถเรียงลำดับสมาชิกใน list, set และ sorted set

โครงร่าง: 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

ส่งคืนเวลาหมดอายุที่เหลืออยู่ของ key โดยหน่วยเป็นวินาที / มิลลิวินาที

หาก key ไม่มี ttl จะส่งคืน -1 หาก key ไม่มีอยู่จะส่งคืน -2

$redis->set('key', 'value', 10);
// หน่วยเป็นวินาที
$redis->ttl('key', function ($result) {
    var_dump($result); // 10
});
// หน่วยเป็นมิลลิวินาที
$redis->pttl('key', function ($result) {
    var_dump($result); // 9999
});
// key ไม่มีอยู่
$redis->pttl('key-not-exists', function ($result) {
    var_dump($result); // -2
});

persist

ลบเวลาหมดอายุที่กำหนดของ key ทำให้ key ไม่มีวันหมดอายุ

หากลบสำเร็จจะส่งคืน 1 หาก key ไม่มีอยู่หรือไม่มีเวลาหมดอายุจะส่งคืน 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 จะถูกดำเนินการ

หากฟิลด์มีอยู่ในแฮชเทเบิล การดำเนินการจะไม่ทำงาน

หาก key ไม่อยู่ ก็จะสร้างแฮชเทเบิลใหม่และดำเนินการตามคำสั่ง 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

ส่งคืนค่าของฟิลด์ที่กำหนดในแฮชเทเบิล

ถ้าฟิลด์ที่ให้ไว้หรือ key ไม่มีอยู่จะส่งคืน null

$redis->hGet('h', 'key1', function ($result) {
    var_dump($result);
});

hLen

ใช้เพื่อรับจำนวนฟิลด์ในแฮชเทเบิล

เมื่อ key ไม่มีอยู่จะส่งคืน 0

$redis->del('h');
$redis->hSet('h', 'key1', 'hello');
$redis->hSet('h', 'key2', 'plop');
$redis->hLen('h', function ($result) {
    var_dump($result); // 2
});

hDel

คำสั่งใช้เพื่อลบฟิลด์ที่กำหนดหนึ่งหรือหลายฟิลด์ในแฮชเทเบิล key ฟิลด์ที่ไม่มีอยู่จะถูกละเว้น

จำนวนฟิลด์ที่ถูกลบสำเร็จจะส่งคืน โดยไม่รวมฟิลด์ที่ถูกละเว้น ในกรณีที่ key ไม่ใช่แฮชจะส่งคืน false

$redis->hDel('h', 'key1');

hKeys

ใช้เพื่อติดต่อรับฟิลด์ทั้งหมดในแฮชเทเบิลเป็นอาร์เรย์

ถ้า key ไม่มีอยู่จะส่งคืนอาร์เรย์เปล่า หาก key ไม่ได้เป็นแฮชจะคืน false

$redis->hKeys('key', function ($result) {
    var_dump($result);
});

hVals

ใช้ส่งคืนค่าในฟิลด์ทั้งหมดของแฮชเทเบิลเป็นอาร์เรย์

ถ้า key ไม่มีอยู่จะส่งคืนอาร์เรย์เปล่า หาก key ไม่ได้เป็นแฮชจะคืน false

$redis->hVals('key', function ($result) {
    var_dump($result);
});

hGetAll

ส่งคืนฟิลด์ทั้งหมดและค่าของแฮชเทเบิลในรูปแบบอาร์เรย์สัมพันธ์

ถ้า key ไม่มีอยู่จะส่งคืนอาร์เรย์เปล่า หาก key ติดตั้งเป็นประเภทแฮชจะส่งคืน 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 หากฟิลด์ไม่มีอยู่หรือ key ไม่มีอยู่ส่งคืน 0 หากเกิดข้อผิดพลาดจะส่งคืน false

$redis->hExists('h', 'a', function ($result) {
    var_dump($result); //
});

hIncrBy

ใช้เพื่อเพิ่มค่าฟิลด์ในแฮชเทเบิลตามค่าที่กำหนด

ค่าจะสามารถเป็นค่าลบ ซึ่งเป็นการดำเนินการหักกับฟิลด์ที่กำหนด

หาก key ของแฮชเทเบิลไม่อยู่ จะถูกสร้างแฮชเทเบิลใหม่และดำเนินการตามคำสั่ง HINCRBY

หากฟิลด์ที่กำหนดไม่อยู่ ค่าในฟิลด์ที่กำหนดก่อนการดำเนินการจะถูกตั้งเป็น 0

การดำเนินการจะจำกัดให้อยู่ในหลักเลขที่แสดงที่ 64 บิต (bit)

$redis->del('h');
$redis->hIncrBy('h', 'x', 2,  function ($result) {
    var_dump($result);
});

hIncrByFloat

เช่นเดียวกับ hIncrBy แต่การเพิ่มจะเป็นแบบทศนิยม

hMSet

พร้อมกันตั้งค่าฟิลด์หลายคู่ (field-value) ในแฮชเทเบิล

คำสั่งนี้จะเขียนทับฟิลด์ที่มีอยู่ในแฮชเทเบิล

หากแฮชเทเบิลไม่มีอยู่จะสร้างแฮชเทเบิลใหม่และดำเนินการตามคำสั่ง HMSET

$redis->del('h');
$redis->hMSet('h', ['name' => 'Joe', 'sex' => 1])

hMGet

ส่งคืนฟิลด์ที่กำหนดในแฮชเทเบิลในรูปแบบอาร์เรย์สัมพันธ์ (key-value)

หากฟิลด์ที่กำหนดไม่มีอยู่ในแฮชเทเบิลจะมีค่าต่อไปนี้เป็นค่า null หาก key ไม่ได้เป็นแฮชจะคืน 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 แสดงถึงองค์ประกอบที่สองจากท้าย -3 แสดงถึงองค์ประกอบที่สามจากท้าย เป็นต้น

หากค่าเฉพาะที่ระบุตำแหน่งไม่อยู่ในช่วงของรายการจะส่งคืน null หาก key ที่กำหนดไม่ใช่ประเภทของรายการจะส่งคืน false

$redis->del('key1']);
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->lindex('key1', 0, function ($r) {
    var_dump($r); // A
});

lInsert

ใช้เพื่อแทรกองค์ประกอบใหม่ก่อนหรือหลังองค์ประกอบในรายการ ขึ้นอยู่กับว่าหากองค์ประกอบที่กำหนดไม่มีในรายการจะไม่ดำเนินการใดๆ

เมื่อรายการไม่มีอยู่จะถือว่าเป็นรายการว่างไม่ดำเนินการใด ๆ

หาก key ไม่ใช่ประเภทรายการจะส่งคืน 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

ทำการลบและส่งคืนองค์ประกอบแรกของรายการ

เมื่อรายการ key ไม่มีอยู่จะส่งคืน null

$redis->del('key1');
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->lPop('key1', function ($r) {
    var_dump($r); // A
});

lPush

แทรกหนึ่งหรือหลายค่าลงในหัวของรายการ หาก key ไม่มีอยู่ จะสร้างรายการว่างและดำเนินการตามคำสั่ง LPUSH เมื่อ key มีอยู่แต่ไม่ใช่ประเภทของรายการจะคืน false

หมายเหตุ: คำสั่ง LPUSH ใน Redis เวอร์ชัน 2.4 ก่อนหน้านั้นจะยอมรับแค่ค่า value เดียวเท่านั้น

$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 หาก key ไม่ใช่รายการจะส่งคืน 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

ส่งคืนสมาชิกในรายการที่กำหนดในช่วงที่ระบุ โดยช่วงที่กำหนดจะถูกชี้โดย offset START และ END ซึ่ง 0 แสดงถึงสมาชิกแรกในรายการ 1 แสดงถึงสมาชิกที่สองในรายการ และอื่น ๆ คุณยังสามารถใช้ดัชนีลบได้ โดย -1 แสดงถึงสมาชิกสุดท้ายในรายการ -2 แสดงถึงองค์ประกอบที่สองจากสุดท้าย -3 แสดงถึงองค์ประกอบที่สามจากท้าย เป็นต้น

ส่งคืนอาร์เรย์ที่ประกอบด้วยองค์ประกอบภายในช่วงที่กำหนด หาก key ไม่ใช่ประเภทของรายการจะส่งคืน 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

ลบองค์ประกอบในรายการที่ตรงกับค่าพารามิเตอร์ VALUE ตามค่าของพารามิเตอร์ COUNT

ค่าของ COUNT อาจมีดังนี้:

  • count > 0 : ค้นหาจากหัวรายการไปหาหางรายการ ลบองค์ประกอบที่ตรงกับ VALUE จำนวน COUNT
  • count < 0 : ค้นหาจากหางรายการไปหาหัวรายการ ลบองค์ประกอบที่ตรงกับ VALUE จำนวน COUNT
  • count = 0 : ลบองค์ประกอบที่ตรงกับ VALUE ทั้งหมดในรายการ

ส่งคืนจำนวนสมาชิกที่ถูกลบ รายนามจะไม่ถูกพิจารณาเมื่อไม่มีรายการที่เกี่ยวข้อง หรือรายการที่ไม่ใช่ประเภทของรายการ

$redis->lRem('key1', 2, 'A', function ($r) {
    var_dump($r); 
});

lSet

ใช้ดัชนีเพื่อตั้งค่าค่าในองค์ประกอบ

หากสำเร็จจะส่งคืน true เมื่อพารามิเตอร์ดัชนีเกินขอบเขตหรือพยายามทำ LSET ในรายการว่างจะส่งคืน false

$redis->lSet('key1', 0, 'X');

lTrim

ใช้ในการตัดรายการโดยให้รายการรักษาเฉพาะสมาชิกภายในช่วงที่กำหนด สมาชิกที่ไม่อยู่ในช่วงที่กำหนดจะถูกลบ

ดัชนี 0 แสดงถึงสมาชิกแรกในรายการ ในขณะที่ 1 แสดงถึงสมาชิกที่สองในรายการ และอื่นๆ คุณยังสามารถใช้ดัชนีลบได้ โดย -1 แสดงถึงสมาชิกสุดท้ายในรายการ -2 แสดงถึงองค์ประกอบที่สองจากสุดท้าย -3 แสดงถึงองค์ประกอบที่สามจากท้าย เป็นต้น

หากสำเร็จจะส่งคืน 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

หมายเหตุ: ในคำสั่ง RPUSH ใน Redis เวอร์ชัน 2.4 จะยอมรับค่า value แค่ค่าเดียวเท่านั้น

$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

ใช้เพื่อส่งคืนความยาวของรายการ หาก key ไม่มีอยู่จะถือว่าเป็นรายการว่าง และส่งคืน 0 หาก key ไม่ใช่ประเภทของรายการจะส่งคืน 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

ใช้ในการเพิ่มสมาชิกหนึ่งหรือหลายสมาชิกลงในกลุ่ม หากสมาชิกนั้นอยู่แล้วจะถูกละเว้น

หากกลุ่ม key ไม่อยู่จะสร้างกลุ่มใหม่ที่ประกอบด้วยสมาชิกที่เพิ่มเพียงกลุ่มเดียว

เมื่อกลุ่ม key ไม่ใช่ประเภทของกลุ่มจะคืน false

หมายเหตุ: ในคำสั่ง SADD ใน Redis เวอร์ชัน 2.4 จะยอมรับแค่สมาชิกเดียวเท่านั้น

$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

ใช้เพื่อส่งคืนจำนวนสมาชิกในกลุ่ม เมื่อกลุ่ม key ไม่มีอยู่จะคืนค่า 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

ส่งคืนความแตกต่างระหว่างกลุ่มแรกกับกลุ่มอื่นๆ โดยสามารถคิดได้ว่าคือสมาชิกที่มีเฉพาะในกลุ่มแรก เทียบได้กับความเป็นไปได้ของการไม่มีกลุ่มนั้น key

$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 หากสมาชิกไม่อยู่ในกลุ่มนั้น หรือ key ไม่อยู่จะส่งคืน 0 หาก key ไม่ใช่กลุ่มจะคืน false

$redis->sIsMember('key1', 'member1', function ($r) {
    var_dump($r); 
});

sMembers

ส่งคืนสมาชิกทั้งหมดในกลุ่ม ค่าของกลุ่มที่ไม่มีจะถูกมองว่าเป็นกลุ่มที่ว่างเปล่า

$redis->sMembers('s', function ($r) {
    var_dump($r); 
});

sMove

ย้ายสมาชิกที่กำหนดไปจากกลุ่มต้นทางสู่กลุ่มปลายทาง

การทำงานของ SMOVE จะเป็นแบบ Atomic

หากกลุ่มต้นทางไม่มีอยู่หรือไม่มีสมาชิกที่กำหนด SMOVE จะไม่ดำเนินการใดๆ และคืน 0 . ในทางกลับกันสมาชิกจะถูกลบออกจากกลุ่มต้นทาง และเพิ่มลงไปในกลุ่มปลายทาง

หากกลุ่มปลายทางมีอยู่แล้วและมีสมาชิกนั้น SMOVE จะลบสมาชิกจากกลุ่มต้นทาง

หาก source หรือ destination ไม่ใช่ประเภทกลุ่มจะส่งคืน 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 เป็นลบ คำสั่งจะส่งคืนอาเรย์ที่มีสมาชิกที่สามารถแสดงมากกว่าหนึ่งครั้งและความยาวของอาร์เรย์คือค่าตอบของจำนวนที่เป็นลบ

การดำเนินการนี้คล้ายกับ 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

ใช้เพื่อลบสมาชิกหนึ่งหรือหลายสมาชิกออกจากกลุ่ม สมาชิกที่ไม่มีหรือสมาชิกที่ถูกละเว้นจะไม่นับรวม

จำนวนสมาชิกที่ถูกลบสำเร็จจะถูกส่งคืน โดยไม่รวมสมาชิกที่ถูกละเว้น

เมื่อ key ไม่ใช่ประเภทกลุ่มจะคืน false

ในคำสั่ง SREM ใน Redis เวอร์ชัน 2.4 จะยอมรับค่าทันหนึ่ง

$redis->sRem('key1', ['member2', 'member3'], function ($r) {
    var_dump($r); 
});

sUnion

คำสั่งส่งคืน union ของกลุ่มที่กำหนด ไม่มีอยู่กลุ่มจะถือว่าเป็นกลุ่มว่าง

$redis->sUnion(['s0', 's1', 's2'], function ($r) {
    var_dump($r); // []
});

sUnionStore

ใช้ในการเก็บ union ของกลุ่มที่กำหนดในกลุ่มที่กำหนดและส่งคืนจำนวนสมาชิก หาก destination ได้มีอยู่จะถูกแทนที่

$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']
});