workerman-redis

イントロダクション

workerman/redisは、workermanに基づいた非同期redisコンポーネントです。

注意
このプロジェクトの主な目的は、redisの非同期サブスクリプション(subscribe、pSubscribe)を実現することです。
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はコルーチンの使用法をサポートしていません。

ドキュメント

説明

コールバック方式では、コールバック関数には一般的に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

指定されたパターンに一致する1つまたは複数のチャンネルを購読します。

各パターンは * をワイルドカードとして使用します。例えば 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

指定された1つまたは複数のチャンネルの情報を購読します。

注意: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){});
// 第3パラメータには有効期限を指定することができ、10秒後に期限切れになります
$redis->set('key','value', 10);
$redis->set('key','value', 10, function($result){});

setEx, pSetEx

指定されたkeyに値とその有効期限を設定します。もしkeyが既に存在する場合、SETEXコマンドは旧値を置き換えます。

// 注意:第2パラメータに有効期限を指定し、単位は秒
$redis->setEx('key', 3600, 'value'); 
// pSetExの単位はミリ秒
$redis->pSetEx('key', 3600, 'value'); 

del

既存のキーを削除するために使用され、結果は数字で返され、削除したkeyの数を表します(存在しないkeyはカウントしません)。

// 1つのkeyを削除
$redis->del('key');
// 複数のkeyを削除
$redis->del(['key', 'key1', 'key2']);

setNx

SETifNot 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に初期化され、その後incr/incrBy操作が実行されます。
もし値が誤った型を含む場合や、文字列型の値が数値として表現できない場合、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に初期化され、その後decr/decrBy操作が実行されます。
もし値が誤った型を含む場合や、文字列型の値が数値として表現できない場合、falseを返します。
成功すると、減少後の数値が返されます。

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

mGet

指定されたすべて(1つ以上)の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の値を設定し、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

現在のデータベースからランダムに1つのkeyを返します。

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

move

現在のデータベースのkeyを指定されたデータベースdbに移動します。

$redis->select(0);  // DB 0に切り替え
$redis->set('x', '42'); // xに42を書き込む
$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の有効期限を設定し、keyが期限切れになると使用できなくなります。有効期限は秒単位です。成功すると1を返し、keyが存在しない場合は0を返し、エラーが発生した場合はfalseを返します。

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

keys

このコマンドは、指定されたパターンpatternに一致するすべてのkeyを検索するために使用されます。

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

type

keyが保存している値の型を返します。結果は文字列で、string、set、list、zset、hashのいずれかであり、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に保存されている文字列の部分文字列を取得します。文字列のスライス範囲はstartとendの2つのオフセットによって決定されます(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は指定された文字列に設定されます。もし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に保存されている文字列値の指定されたオフセット上のビットを取得します。

$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

複数のkey(文字列値を含む)間でビット操作を実行し、結果をターゲットkeyに保存します。

BITOPコマンドは、4つのビット演算をサポートしています:ANDORXOR、およびNOT

返される結果は、ターゲットkeyに保存されている文字列のサイズ、すなわち最も長い入力文字列のサイズに等しいです。

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

bitCount

文字列に設定されたビット数をカウントします(人口計数)。

デフォルトでは、文字列に含まれているすべてのバイトをチェックします。追加の引数startendを渡すことで、特定の範囲を指定してカウント操作を行うことができます。

GETRANGEコマンドと似ており、startおよびendは負の値を含むことができ、これにより文字列の末尾からバイトをインデックス付けすることができます。-1は最後のバイト、-2は倒数第2のバイト、などです。

結果は、文字列内の1の値の数を返します。

存在しないkeyは空の文字列と見なされ、このコマンドはゼロを返します。

$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

1つの原子コマンドで複数のキーと値のペアを設定します。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内の1つまたは複数の指定されたフィールドを削除するためのコマンドで、存在しないフィールドは無視されます。

成功した削除フィールドの数を返しますが、無視されたフィールドは含まれません。もしkeyがhashでない場合はfalseを返します。

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

hKeys

ハッシュテーブル内のすべてのフィールドを配列形式で取得します。

keyが存在しない場合は空の配列を返します。keyがhashでない場合はfalseを返します。

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

hVals

ハッシュテーブル内のすべてのフィールドの値を配列形式で返します。

keyが存在しない場合は空の配列を返します。keyがhashでない場合はfalseを返します。

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

hGetAll

ハッシュテーブル内のすべてのフィールドと値を連想配列形式で返します。

keyが存在しない場合は空の配列を返します。keyがhash型でない場合は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に初期化されます。

文字列値が保存されているフィールドにHINCRBYコマンドを実行すると、falseが返されます。

この操作の値は64ビットの符号付き数値表現内に制限されます。

$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

連想配列形式でハッシュテーブル内の1つまたは複数の指定されたフィールドの値を返します。

指定されたフィールドがハッシュテーブルに存在しない場合、対応するフィールドはnull値になります。keyがhashでない場合は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はリストの倒数第2の要素を表します。

指定されたインデックス値がリストの範囲に含まれない場合、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

1つ以上の値をリストの先頭に挿入します。もしkeyが存在しない場合、空のリストが作成され、LPUSH操作が実行されます。keyが存在するがリスト型でない場合はfalseを返します。

注意:Redis 2.4バージョン以前のLPUSHコマンドは単一の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

リスト内の指定された範囲内の要素を返します。範囲はオフセットSTARTとENDによって指定されます。0はリストの最初の要素を表し、1はリストの第2の要素を表します。負のインデックスも使用でき、-1はリストの最後の要素、-2はリストの倒数第2の要素を表します。

指定された範囲内の要素を含む配列が返されます。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

引数COUNTの値に基づいて、リスト内のパラメータVALUEに等しい要素を削除します。

COUNTの値は以下のいずれかになります:

  • count > 0 : 表の先頭から表の末尾に向かって検索し、COUNTの数だけVALUEに等しい要素を削除します。
  • count < 0 : 表の末尾から表の先頭に向かって検索し、COUNTの絶対値の数だけVALUEに等しい要素を削除します。
  • 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

リストのトリミングを行い、リストが指定された範囲内の要素のみを保持します。指定された範囲外の要素はすべて削除されます。

インデックス0はリストの最初の要素を表し、1はリストの第2の要素を表します。負のインデックスも使用でき、-1はリストの最後の要素、-2はリストの倒数第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

1つ以上の値をリストの末尾(最右)に挿入し、挿入後のリストの長さを返します。

リストが存在しない場合、空のリストが作成され、RPUSH操作が実行されます。リストが存在するがリスト型でない場合はfalseを返します。

注意:Redis 2.4バージョン以前のRPUSHコマンドは単一の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

1つまたは複数のメンバー要素をセットに追加し、すでにセットに存在するメンバー要素は無視されます。

セットのkeyが存在しない場合、追加された要素のみを含むセットが作成されます。

セットのkeyがセット型でない場合はfalseを返します。

注意:Redis 2.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

セット内の要素の数を返します。セットの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

指定されたセット間の差を指定されたセットに保存します。指定されたセット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->sDiffStore('dst', ['s0', 's1', 's2'], function ($r) {
    var_dump($r); // 2
});
$redis->sMembers('dst', function ($r) {
    var_dump($r); // ['2', '4']
});

sInter

指定されたすべての集合の交差点を返します。存在しないセットkeyは空セットと見なされます。指定されたセットの中に空セットが1つでもあれば、結果も空セットになります。

$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

集合内のすべてのメンバーを返します。存在しない集合keyは空集合と見なされます。

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

sMove

指定されたメンバーmember要素をsourceセットからdestinationセットに移動します。

SMOVEは原子的な操作です。

もしsourceセットが存在しない場合や、指定されたmember要素を含まない場合、SMOVEコマンドは何も実行せず、0を返します。そうでない場合、member要素はsourceセットから削除され、destinationセットに追加されます。

destinationセットがすでにmember要素を含んでいる場合、SMOVEコマンドは単にsourceセット内のmember要素を削除するだけです。

sourceまたはdestinationが集合でない場合はfalseを返します。

$redis->sMove('key1', 'key2', 'member13');

sPop

集合内の指定されたkeyの1つまたは複数のランダム要素を削除し、削除後に要素を返します。

集合が存在しない場合や空集合の場合は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コマンドは、集合内の1つのランダム要素を返します。

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

集合内の1つまたは複数のメンバー要素を削除し、存在しないメンバー要素は無視されます。

成功して削除された要素の数を返しますが、無視された要素は含まれません。

keyが集合型でない場合はfalseを返します。

Redis 2.4バージョン以前のSREMは単一のメンバー値のみを受け入れます。

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

sUnion

コマンドは、指定された集合の和集合を返します。存在しない集合keyは空セットと見なされます。

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

sUnionStore

指定された集合の和集合を指定された集合destinationに保存し、保存した要素の数を返します。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']
});