workerman-redis
介紹
workeman/redis是基于workerman的異步redis組件。
注意
此項(xiàng)目主要目的是實(shí)現(xiàn)redis異步訂閱(subscribe、pSubscribe)
因?yàn)閞edis足夠快,所以除非需要psubscribe subscribe異步訂閱,否則無(wú)需使用此異步客戶(hù)端,使用redis擴(kuò)展會(huì)有更好的性能
安裝:
composer require workerman/redis ^v2.0.3
回調(diào)用法
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();
協(xié)程用法
注意
協(xié)程用法需要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();
當(dāng)不設(shè)置回調(diào)函數(shù)時(shí),客戶(hù)端會(huì)用同步的方式返回異步請(qǐng)求結(jié)果,請(qǐng)求過(guò)程不阻塞當(dāng)前進(jìn)程,也就是可以并發(fā)處理請(qǐng)求。
注意
psubscribe subscribe 不支持協(xié)程用法
文檔
說(shuō)明
回調(diào)方式中,回調(diào)函數(shù)一般有2個(gè)參數(shù)($result, $redis),$result
為結(jié)果,$redis
為redis實(shí)例。例如:
use Workerman\Redis\Client;
$redis = new Client('redis://127.0.0.1:6379');
// 設(shè)置回調(diào)函數(shù)判斷set調(diào)用結(jié)果
$redis->set('key', 'value', function ($result, $redis) {
var_dump($result); // true
});
// 回調(diào)函數(shù)都是可選測(cè)參數(shù),這里省略了回調(diào)函數(shù)
$redis->set('key1', 'value1');
// 回調(diào)函數(shù)可以嵌套
$redis->get('key', function ($result, $redis){
$redis->set('key2', 'value2', function ($result) {
var_dump($result);
});
});
連接
use Workerman\Redis\Client;
// 省略回調(diào)
$redis = new Client('redis://127.0.0.1:6379');
// 帶回調(diào)
$redis = new Client('redis://127.0.0.1:6379', [
'connect_timeout' => 10 // 設(shè)置連接超時(shí)10秒,不設(shè)置默認(rèn)5秒
], function ($success, $redis) {
// 連接結(jié)果回調(diào)
if (!$success) echo $redis->error();
});
auth
// 密碼驗(yàn)證
$redis->auth('password', function ($result) {
});
// 用戶(hù)名密碼驗(yàn)證
$redis->auth('username', 'password', function ($result) {
});
pSubscribe
訂閱一個(gè)或多個(gè)符合給定模式的頻道。
每個(gè)模式以 * 作為匹配符,比如 it* 匹配所有以 it 開(kāi)頭的頻道( it.news 、 it.blog 、 it.tweets 等等)。 news.* 匹配所有以 news. 開(kāi)頭的頻道( news.it 、 news.global.today 等等),諸如此類(lèi)。
注意:pSubscribe回調(diào)函數(shù)有4個(gè)參數(shù)($pattern, $channel, $message, $redis)
當(dāng)$redis實(shí)例調(diào)用pSubscribe或subscribe接口后,當(dāng)前實(shí)例再調(diào)用其它方法將被忽略。
$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
用于訂閱給定的一個(gè)或多個(gè)頻道的信息。
注意:subscribe回調(diào)函數(shù)有3個(gè)參數(shù)($channel, $message, $redis)
當(dāng)$redis實(shí)例調(diào)用pSubscribe或subscribe接口后,當(dāng)前實(shí)例再調(diào)用其它方法將被忽略。
$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
用于將信息發(fā)送到指定的頻道。
返回接收到信息的訂閱者數(shù)量。
$redis2->publish('news', 'news content');
select
// 省略回調(diào)
$redis->select(2);
$redis->select('test', function ($result, $redis) {
// select參數(shù)必須為數(shù)字,所以這里$result為false
var_dump($result, $redis->error());
});
get
命令用于獲取指定 key 的值。如果 key 不存在,返回 NULL 。如果key 儲(chǔ)存的值不是字符串類(lèi)型,返回false。
$redis->get('key', function($result) {
// 如果key不存在則返回NULL,發(fā)生錯(cuò)誤則返回false
var_dump($result);
});
set
用于設(shè)置給定 key 的值。如果 key 已經(jīng)存儲(chǔ)其他值, SET 就覆寫(xiě)舊值,且無(wú)視類(lèi)型。
$redis->set('key', 'value');
$redis->set('key', 'value', function($result){});
// 第三個(gè)參數(shù)可以傳遞過(guò)期時(shí)間,10秒后過(guò)期
$redis->set('key','value', 10);
$redis->set('key','value', 10, function($result){});
setEx, pSetEx
為指定的 key 設(shè)置值及其過(guò)期時(shí)間。如果 key 已經(jīng)存在, SETEX 命令將會(huì)替換舊的值。
// 注意第二個(gè)參數(shù)傳遞過(guò)期時(shí)間,單位秒
$redis->setEx('key', 3600, 'value');
// pSetEx 單位為毫秒
$redis->pSetEx('key', 3600, 'value');
del
用于刪除已存在的鍵,返回結(jié)果為數(shù)字,代表刪除了多少個(gè)key(不存在的key不做計(jì)數(shù))。
// 刪除一個(gè)key
$redis->del('key');
// 刪除多個(gè)key
$redis->del(['key', 'key1', 'key2']);
setNx
(SETifNot eXists) 命令在指定的 key 不存在時(shí),為 key 設(shè)置指定的值。
$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 是否存在。返回結(jié)果為數(shù)字,代表存在的key的個(gè)數(shù)。
$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 中儲(chǔ)存的數(shù)字值增一/制定的值。 如果 key 不存在,那么 key 的值會(huì)先被初始化為 0 ,然后再執(zhí)行 incr/incrBy 操作。
如果值包含錯(cuò)誤的類(lèi)型,或字符串類(lèi)型的值不能表示為數(shù)字,那么返回false。
成功則返回為增加后的數(shù)值。
$redis->incr('key1', function ($result) {
var_dump($result);
});
$redis->incrBy('key1', 10, function ($result) {
var_dump($result);
});
incrByFloat
為 key 中所儲(chǔ)存的值加上指定的浮點(diǎn)數(shù)增量值。
如果 key 不存在,那么 INCRBYFLOAT 會(huì)先將 key 的值設(shè)為 0 ,再執(zhí)行加法操作。
如果值包含錯(cuò)誤的類(lèi)型,或字符串類(lèi)型的值不能表示為數(shù)字,那么返回false。
成功則返回增加后的數(shù)值。
$redis->incrByFloat('key1', 1.5, function ($result) {
var_dump($result);
});
decr, decrBy
命令將 key 所儲(chǔ)存的值減去一/指定的減量值。
如果 key 不存在,那么 key 的值會(huì)先被初始化為 0 ,然后再執(zhí)行 decr/decrBy 操作。
如果值包含錯(cuò)誤的類(lèi)型,或字符串類(lèi)型的值不能表示為數(shù)字,那么返回false。
成功則返回減少后的數(shù)值。
$redis->decr('key1', function ($result) {
var_dump($result);
});
$redis->decrBy('key1', 10, function ($result) {
var_dump($result);
});
mGet
返回所有(一個(gè)或多個(gè))給定 key 的值。 如果給定的 key 里面,有某個(gè) key 不存在,那么這個(gè) 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
用于設(shè)置指定 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
從當(dāng)前數(shù)據(jù)庫(kù)中隨機(jī)返回一個(gè) key。
$redis->randomKey(function($key) use ($redis) {
$redis->get($key, function ($result) {
var_dump($result);
}) ;
})
move
將當(dāng)前數(shù)據(jù)庫(kù)的 key 移動(dòng)到給定的數(shù)據(jù)庫(kù) db 當(dāng)中。
$redis->select(0); // switch to DB 0
$redis->set('x', '42'); // write 42 to x
$redis->move('x', 1, function ($result) { // move to DB 1
var_dump($result); // 1
}) ;
$redis->select(1); // switch to DB 1
$redis->get('x', function ($result) {
var_dump($result); // '42'
}) ;
rename
修改 key 的名稱(chēng),key不存在則返回false。
$redis->set('x', '42');
$redis->rename('x', 'y', function ($result) {
var_dump($result); // true
}) ;
renameNx
在新的 key 不存在時(shí)修改 key 的名稱(chēng)。
$redis->del('y');
$redis->set('x', '42');
$redis->renameNx('x', 'y', function ($result) {
var_dump($result); // 1
}) ;
expire
于設(shè)置 key 的過(guò)期時(shí)間,key 過(guò)期后將不再可用。單位以秒。成功返回1,key不存在返回0,發(fā)生錯(cuò)誤返回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 所儲(chǔ)存的值的類(lèi)型。返回結(jié)果為字符串, string set list zset hash none 中的一種,其中none表示key不存在。
$redis->type('key', function ($result) {
var_dump($result); // string set list zset hash none
}) ;
append
如果 key 已經(jīng)存在并且是一個(gè)字符串, APPEND 命令將 value 追加到 key 原來(lái)的值的末尾,并返回字符串長(zhǎng)度。
如果 key 不存在, APPEND 就簡(jiǎn)單地將給定 key 設(shè)為 value ,就像執(zhí)行 SET key value 一樣,并返回字符串長(zhǎng)度。
如果key存在,但是不是一個(gè)字符串,則返回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
獲取存儲(chǔ)在指定 key 中字符串的子字符串。字符串的截取范圍由 start 和 end 兩個(gè)偏移量決定(包括 start 和 end 在內(nèi))。如果key不存在,則返回空字符串。如果key不是字符串類(lèi)型,則返回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 所儲(chǔ)存的字符串值,覆蓋的位置從偏移量 offset 開(kāi)始。如果key不存在,則將key設(shè)置為指定字符串。如果key不是字符串類(lèi)型,則返回false。
返回結(jié)果為更改后的字符串長(zhǎng)度。
$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 所儲(chǔ)存的字符串值的長(zhǎng)度。當(dāng) key 儲(chǔ)存的不是字符串值時(shí),返回false。
$redis->set('key', 'value');
$redis->strlen('key', function ($result) {
var_dump($result); // 5
}) ;
getBit
對(duì) key 所儲(chǔ)存的字符串值,獲取指定偏移量上的位(bit)。
$redis->set('key', "\x7f"); // this is 0111 1111
$redis->getBit('key', 0, function ($result) {
var_dump($result); // 0
}) ;
setBit
對(duì) key 所儲(chǔ)存的字符串值,設(shè)置或清除指定偏移量上的位(bit)。
返回值為0或1,是修改前的值。
$redis->set('key', "*"); // ord("*") = 42 = 0x2f = "0010 1010"
$redis->setBit('key', 5, 1, function ($result) {
var_dump($result); // 0
}) ;
bitOp
在多個(gè)鍵(包含字符串值)之間執(zhí)行按位操作并將結(jié)果存儲(chǔ)在目標(biāo)鍵中。
BITOP 命令支持四個(gè)按位運(yùn)算:AND,OR,XOR和NOT。
返回結(jié)果存儲(chǔ)在目標(biāo)密鑰中的字符串的大小,即等于最長(zhǎng)輸入字符串的大小。
$redis->set('key1', "abc");
$redis->bitOp( 'AND', 'dst', 'key1', 'key2', function ($result) {
var_dump($result); // 3
}) ;
bitCount
計(jì)算字符串中的設(shè)置位數(shù)(人口計(jì)數(shù))。
默認(rèn)情況下,會(huì)檢查字符串中包含的所有字節(jié)。只能在傳遞附加參數(shù) start 和 end 的間隔中指定計(jì)數(shù)操作。
與 GETRANGE 命令類(lèi)似,開(kāi)始和結(jié)束可以包含負(fù)值,以便從字符串的末尾開(kāi)始索引字節(jié),其中-1是最后一個(gè)字節(jié),-2是倒數(shù)第二個(gè)字符,等等。
結(jié)果返回字符串中值為1的位數(shù)。
不存在的鍵被視為空字符串,因此該命令將返回零。
$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命令可以對(duì)list、set和sorted set的元素進(jìn)行排序。
原型:sort($key, $options, $callback);
其中options是以下可選的key和值
$options = [
'by' => 'some_pattern_*',
'limit' => [0, 1],
'get' => 'some_other_pattern_*', // or an array of patterns
'sort' => 'asc', // or '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 的剩余過(guò)期時(shí)間。
如果key沒(méi)有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 的過(guò)期時(shí)間,使得 key 永不過(guò)期。
如果成功移除則返回1,如果key不存在或者沒(méi)有過(guò)期時(shí)間返回0,發(fā)生錯(cuò)誤返回false。
$redis->persist('key');
mSet, mSetNx
在一個(gè)原子命令中設(shè)置多個(gè)鍵值對(duì)。mSetNx僅在設(shè)置了所有鍵的情況下返回1。
成功返回1,失敗返回0,發(fā)生錯(cuò)誤返回false。
$redis->mSet(['key0' => 'value0', 'key1' => 'value1']);
hSet
為哈希表中的字段賦值 。
如果字段是哈希表中的一個(gè)新建字段,并且值設(shè)置成功,返回 1 。 如果哈希表中域字段已經(jīng)存在且舊值已被新值覆蓋,返回 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
為哈希表中不存在的的字段賦值 。
如果哈希表不存在,一個(gè)新的哈希表被創(chuàng)建并進(jìn)行 HSET 操作。
如果字段已經(jīng)存在于哈希表中,操作無(wú)效。
如果 key 不存在,一個(gè)新哈希表被創(chuàng)建并執(zhí)行 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 不存在時(shí),返回 null。
$redis->hGet('h', 'key1', function ($result) {
var_dump($result);
});
hLen
用于獲取哈希表中字段的數(shù)量。
當(dāng) key 不存在時(shí),返回 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 中的一個(gè)或多個(gè)指定字段,不存在的字段將被忽略。
返回被成功刪除字段的數(shù)量,不包括被忽略的字段。如果key不是hash則返回false。
$redis->hDel('h', 'key1');
hKeys
以數(shù)組的形式獲取哈希表中的所有域。
如果key不存在,則返回空的數(shù)組。如果key對(duì)應(yīng)的不是hash,則返回false。
$redis->hKeys('key', function ($result) {
var_dump($result);
});
hVals
以數(shù)組的形式返回哈希表所有域的值。
如果key不存在,則返回空的數(shù)組。如果key對(duì)應(yīng)的不是hash,則返回false。
$redis->hVals('key', function ($result) {
var_dump($result);
});
hGetAll
以關(guān)聯(lián)數(shù)組的形式返回哈希表中所有的字段和值。
如果key不存在,則返回空數(shù)組。如果key部署hash類(lèi)型,則返回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,發(fā)生錯(cuò)誤返回false。
$redis->hExists('h', 'a', function ($result) {
var_dump($result); //
});
hIncrBy
用于為哈希表中的字段值加上指定增量值。
增量也可以為負(fù)數(shù),相當(dāng)于對(duì)指定字段進(jìn)行減法操作。
如果哈希表的 key 不存在,一個(gè)新的哈希表被創(chuàng)建并執(zhí)行 HINCRBY 命令。
如果指定的字段不存在,那么在執(zhí)行命令前,字段的值被初始化為 0 。
對(duì)一個(gè)儲(chǔ)存字符串值的字段執(zhí)行 HINCRBY 命令將返回false。
本操作的值被限制在 64 位(bit)有符號(hào)數(shù)字表示之內(nèi)。
$redis->del('h');
$redis->hIncrBy('h', 'x', 2, function ($result) {
var_dump($result);
});
hIncrByFloat
類(lèi)似與hIncrBy,只不過(guò)增量是浮點(diǎn)型。
hMSet
同時(shí)將多個(gè) field-value (字段-值)對(duì)設(shè)置到哈希表中。
此命令會(huì)覆蓋哈希表中已存在的字段。
如果哈希表不存在,會(huì)創(chuàng)建一個(gè)空哈希表,并執(zhí)行 HMSET 操作。
$redis->del('h');
$redis->hMSet('h', ['name' => 'Joe', 'sex' => 1])
hMGet
以關(guān)聯(lián)數(shù)組的形式返回哈希表中一個(gè)或多個(gè)給定字段的值。
如果指定的字段不存在于哈希表,那么對(duì)應(yīng)的字段將是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
移出并獲取列表的第一個(gè)元素/最后一個(gè)元素, 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
$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
從列表中取出最后一個(gè)元素,并插入到另外一個(gè)列表的頭部; 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。如果超時(shí)則返回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
通過(guò)索引獲取列表中的元素。你也可以使用負(fù)數(shù)下標(biāo),以 -1 表示列表的最后一個(gè)元素, -2 表示列表的倒數(shù)第二個(gè)元素,以此類(lèi)推。
如果指定索引值不在列表的區(qū)間范圍內(nèi),返回 null。如果對(duì)應(yīng)的key不是列表類(lèi)型,則返回false。
$redis->del('key1']);
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->lindex('key1', 0, function ($r) {
var_dump($r); // A
});
lInsert
在列表的元素前或者后插入元素。當(dāng)指定元素不存在于列表中時(shí),不執(zhí)行任何操作。
當(dāng)列表不存在時(shí),被視為空列表,不執(zhí)行任何操作。
如果 key 不是列表類(lèi)型則返回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
移除并返回列表的第一個(gè)元素。
當(dāng)列表 key 不存在時(shí),返回 null 。
$redis->del('key1');
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->lPop('key1', function ($r) {
var_dump($r); // A
});
lPush
一個(gè)或多個(gè)值插入到列表頭部。 如果 key 不存在,一個(gè)空列表會(huì)被創(chuàng)建并執(zhí)行 LPUSH 操作。 當(dāng) key 存在但不是列表類(lèi)型時(shí)返回false。
注意:在Redis 2.4版本以前的 LPUSH 命令,都只接受單個(gè) 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
將一個(gè)值插入到已存在的列表頭部,列表不存在時(shí)操作無(wú)效,返回0。如果key不是列表類(lèi)型則返回false。
返回值為lPushx 命令執(zhí)行之后,列表的長(zhǎng)度。
$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
返回列表中指定區(qū)間內(nèi)的元素,區(qū)間以偏移量 START 和 END 指定。 其中 0 表示列表的第一個(gè)元素, 1 表示列表的第二個(gè)元素,以此類(lèi)推。 你也可以使用負(fù)數(shù)下標(biāo),以 -1 表示列表的最后一個(gè)元素, -2 表示列表的倒數(shù)第二個(gè)元素,以此類(lèi)推。
返回一個(gè)包含指定區(qū)間內(nèi)的元素?cái)?shù)組。如果key不是列表類(lèi)型則返回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
根據(jù)參數(shù) COUNT 的值,移除列表中與參數(shù) VALUE 相等的元素。
COUNT 的值可以是以下幾種:
- count > 0 : 從表頭開(kāi)始向表尾搜索,移除與 VALUE 相等的元素,數(shù)量為 COUNT 。
- count < 0 : 從表尾開(kāi)始向表頭搜索,移除與 VALUE 相等的元素,數(shù)量為 COUNT 的絕對(duì)值。
- count = 0 : 移除表中所有與 VALUE 相等的值。
返回被移除元素的數(shù)量。 列表不存在時(shí)返回 0。不是列表時(shí)返回false。
$redis->lRem('key1', 2, 'A', function ($r) {
var_dump($r);
});
lSet
通過(guò)索引來(lái)設(shè)置元素的值。
成功時(shí)返回true,當(dāng)索引參數(shù)超出范圍,或?qū)σ粋€(gè)空列表進(jìn)行 LSET 時(shí)返回false。
$redis->lSet('key1', 0, 'X');
lTrim
對(duì)一個(gè)列表進(jìn)行修剪(trim),就是說(shuō),讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除。
下標(biāo) 0 表示列表的第一個(gè)元素,以 1 表示列表的第二個(gè)元素,以此類(lèi)推。 你也可以使用負(fù)數(shù)下標(biāo),以 -1 表示列表的最后一個(gè)元素, -2 表示列表的倒數(shù)第二個(gè)元素,以此類(lèi)推。
成功時(shí)返回true,失敗時(shí)返回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
用于移除列表的最后一個(gè)元素,返回值為移除的元素。
當(dāng)列表不存在時(shí),返回 null 。
$redis->rPop('key1', function ($r) {
var_dump($r);
});
rPopLPush
于移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回。
$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
將一個(gè)或多個(gè)值插入到列表的尾部(最右邊),并返回插入后的列表的長(zhǎng)度。
如果列表不存在,一個(gè)空列表會(huì)被創(chuàng)建并執(zhí)行 RPUSH 操作。 當(dāng)列表存在但不是列表類(lèi)型時(shí)返回false。
注意:在 Redis 2.4 版本以前的 RPUSH 命令,都只接受單個(gè) value 值。
$redis->del('key1');
$redis->rPush('key1', 'A', function ($r) {
var_dump($r); // 1
});
rPushX
將一個(gè)值插入到已存在的列表尾部(最右邊)并返回列表的長(zhǎng)度。如果列表不存在,操作無(wú)效,返回0。 當(dāng)列表存在但不是列表類(lèi)型時(shí)返回false。
$redis->del('key1');
$redis->rPushX('key1', 'A', function ($r) {
var_dump($r); // 0
});
lLen
返回列表的長(zhǎng)度。 如果列表 key 不存在,則 key 被解釋為一個(gè)空列表,返回 0 。 如果 key 不是列表類(lèi)型,返回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
將一個(gè)或多個(gè)成員元素加入到集合中,已經(jīng)存在于集合的成員元素將被忽略。
假如集合 key 不存在,則創(chuàng)建一個(gè)只包含添加的元素作成員的集合。
當(dāng)集合 key 不是集合類(lèi)型時(shí)返回false。
注意:在 Redis2.4 版本以前, SADD 只接受單個(gè)成員值。
$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
返回集合中元素的數(shù)量。當(dāng)集合 key 不存在時(shí)返回 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
返回第一個(gè)集合與其他集合之間的差異,也可以認(rèn)為說(shuō)第一個(gè)集合中獨(dú)有的元素。不存在的集合 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
給定集合之間的差集存儲(chǔ)在指定的集合中。如果指定的集合 key 已存在,則會(huì)被覆蓋。
$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 被視為空集。 當(dāng)給定集合當(dāng)中有一個(gè)空集時(shí),結(jié)果也為空集。
$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
將給定集合之間的交集存儲(chǔ)在指定的集合中并返回存儲(chǔ)交集的集合的元素?cái)?shù)量。如果指定的集合已經(jīng)存在,則將其覆蓋。
$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對(duì)應(yīng)的不是集合類(lèi)型,則返回false。
$redis->sIsMember('key1', 'member1', function ($r) {
var_dump($r);
});
sMembers
返回集合中的所有的成員。 不存在的集合 key 被視為空集合。
$redis->sMembers('s', function ($r) {
var_dump($r);
});
sMove
將指定成員 member 元素從 source 集合移動(dòng)到 destination 集合。
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,則 SMOVE 命令不執(zhí)行任何操作,僅返回 0 。否則, member 元素從 source 集合中被移除,并添加到 destination 集合中去。
當(dāng) destination 集合已經(jīng)包含 member 元素時(shí), SMOVE 命令只是簡(jiǎn)單地將 source 集合中的 member 元素刪除。
當(dāng) source 或 destination 不是集合類(lèi)型時(shí)返回false。
$redis->sMove('key1', 'key2', 'member13');
sPop
移除集合中的指定 key 的一個(gè)或多個(gè)隨機(jī)元素,移除后會(huì)返回移除的元素。
當(dāng)集合不存在或是空集時(shí),返回 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 命令用于返回集合中的一個(gè)隨機(jī)元素。
從 Redis 2.6 版本開(kāi)始, Srandmember 命令接受可選的 count 參數(shù):
- 如果 count 為正數(shù),且小于集合基數(shù),那么命令返回一個(gè)包含 count 個(gè)元素的數(shù)組,數(shù)組中的元素各不相同。如果 count 大于等于集合基數(shù),那么返回整個(gè)集合。
- 如果 count 為負(fù)數(shù),那么命令返回一個(gè)數(shù)組,數(shù)組中的元素可能會(huì)重復(fù)出現(xiàn)多次,而數(shù)組的長(zhǎng)度為 count 的絕對(duì)值。
該操作和 SPOP 相似,但 SPOP 將隨機(jī)元素從集合中移除并返回,而 Srandmember 則僅僅返回隨機(jī)元素,而不對(duì)集合進(jìn)行任何改動(dòng)。
$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
移除集合中的一個(gè)或多個(gè)成員元素,不存在的成員元素會(huì)被忽略。
返回被成功移除的元素的數(shù)量,不包括被忽略的元素。
當(dāng) key 不是集合類(lèi)型返回false。
在 Redis 2.4 版本以前, SREM 只接受單個(gè)成員值。
$redis->sRem('key1', ['member2', 'member3'], function ($r) {
var_dump($r);
});
sUnion
命令返回給定集合的并集。不存在的集合 key 被視為空集。
$redis->sUnion(['s0', 's1', 's2'], function ($r) {
var_dump($r); // []
});
sUnionStore
將給定集合的并集存儲(chǔ)在指定的集合 destination 中并返回元素?cái)?shù)量。如果 destination 已經(jīng)存在,則將其覆蓋。
$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']
});