七. Redis 有序集合(sorted set)操作
Redis 有序集合是 string 類型元素的集合构罗,每個元素會關(guān)聯(lián)一個 double 類型的分數(shù),通過分數(shù)來為集合中的成員進行從小到大的排序歼郭。
有序集合的成員是唯一的乱陡,但分數(shù)(score)可以重復。
集合是通過哈希表實現(xiàn)的经伙,所以添加芬首,刪除赴捞,查找的復雜度都是 O(1)。 集合中最大的成員數(shù)為 2的32次方減 1 (4294967295, 每個集合可存儲40多億個成員)郁稍。
1. zAdd - 向有序集合添加一個或多個成員赦政,或者更新已存在成員的分數(shù)
// 添加操作是返回添加成員個數(shù);如果是更新已存在成員的分數(shù)耀怜,無論是否成功都返回0
$redis->zAdd('key', 6, 'v1', 2,'v2', 3,'v3');
2. zCard - 獲取有序集合的成員數(shù)
// 返回集合成員數(shù)恢着,整型
$res = $redis->zCard('key');
3. zCount - 計算在有序集合中指定區(qū)間分數(shù)的成員數(shù)
// 返回整型值
$redis->zCount('key',1,6);
4. zIncrBy - 有序集合中對指定成員的分數(shù)加上增量 increment
// 返回值為 key 集合的成員 v2 當前的分數(shù)值
$redis->zIncrBy('key',6,'v2');
5. zInterStore - 計算給定的一個或多個有序集的交集并將結(jié)果存儲在新的有序集合中
redis->del('k1');
$redis->del('k2');
$redis->del('k3');
$redis->del('ko1');
$redis->del('ko2');
$redis->del('ko3');
$redis->del('ko4');
$redis->zAdd('k1', 0,'val0');
$redis->zAdd('k1', 1,'val1');
$redis->zAdd('k1', 3,'val3');
$redis->zAdd('k2',2,'val1');
$redis->zAdd('k2',3,'val3');
// 返回保存到目標結(jié)算集的成員數(shù)量, 新集合中成員分數(shù)為合并集合中該成員的分數(shù)之和
$redis->zInterStore('ko1', array('k1','k2'));
$redis->zInterStore('ko2', array('k1','k2'), array(1,1));
// 返回保存到目標結(jié)算集的成員數(shù)量, 新集合中成員分數(shù)為合并集合中該成員的分數(shù)最小值
$redis->zInterStore('ko3', array('k1', 'k2'), array(1,5),'min');
$redis->zInterStore('ko3', array('k1', 'k2'), array(1,5),'max');
6. zRange - 通過索引區(qū)間返回有序集合指定區(qū)間內(nèi)的成員
$redis->zAdd('key1', 0, 'val0');
$redis->zAdd('key1',2,'val2');
$redis->zAdd('key1',10,'val10');
// 返回包含成員的數(shù)組,鍵名不存在時返回空數(shù)組
$redis->zRange('key1',0,-1);
/* 輸出
array(3) {
[0]=>
string(4) "val0"
[1]=>
string(4) "val2"
[2]=>
string(5) "val10"
}
*/
// 返回以成員-分數(shù)為鍵值的數(shù)組
$redis->zRange('key1',0,-1,true);
/*輸出
array(3) {
["val0"]=>
float(0)
["val2"]=>
float(2)
["val10"]=>
float(10)
}
*/
7. zRangeByLex- 通過字典區(qū)間返回有序集合的成員
// zRangeByLex- 通過字典區(qū)間返回有序集合的成員
foreach(['a','b','c','d','e','f','g'] as $k=>$v){
$redis->zAdd('key',$k,$v);
}
// '-'號代表最小值; '[' 號代表包含
$redis->zRangeByLex('key','-','[c');
/* 輸出
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
}
*/
'(' 號代表不包含成員
$redis->zRangeByLex('key','-','(c');
/* 輸出
array(2) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
}
*/
'+' 號代表最大值
$res = $redis->zRangeByLex('key','-','+');
/* 輸出
array(7) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
[4]=>
string(1) "e"
[5]=>
string(1) "f"
[6]=>
string(1) "g"
}
*/
8. zRangeByScore - 通過分數(shù)返回有序集合指定區(qū)間內(nèi)的成員
// 通過分數(shù)返回有序集合指定區(qū)間內(nèi)的成員
$redis->zAdd('key',0,'val0');
$redis->zAdd('key',2,'val2');
$redis->zAdd('key', 10,'val10');
$redis->zRangeByScore('key',0,3);
/* 輸出
array(2) {
[0]=>
string(4) "val0"
[1]=>
string(4) "val2"
}
*/
// 該方法帶上第三個參數(shù)與不帶的測試效果一樣
//$redis->zRangeByScore('key', 0, 3, array('WITHSCORES' => TRUE));
//$redis->zRangeByScore('key',0,3,['LIMIT'=> [1,1]]);
9. zRank - 返回有序集合中指定成員的索引
// 成功返回0财破,失敗返回false
$rs = $redis->zRank('key','val3');
10. zRem - 移除有序集合中的一個或多個成員
// 成功返回1掰派,失敗返回0
$rs = $redis->zRem('key','val0');
11. zRemRangeByRank - 移除有序集合中給定的排名區(qū)間的所有成員
$redis->zAdd('key',1,'one');
$redis->zAdd('key',2,'two');
$redis->zAdd('key',3,'three');
// 返回移除成員數(shù)
$redis->zRemRangeByRank('key',0,1);
/* 輸出
int(2)
*/
12. zRemRangeByScore - 移除有序集合中給定的分數(shù)區(qū)間的所有成員
$redis->zAdd('key',0,'val0');
$redis->zAdd('key',2,'val2');
$redis->zAdd('key',10,'val10');
// 返回移除成員數(shù)
$redis->zRemRangeByScore('key',0,3);
/* 輸出
int(2)
*/
13. zRevRange - 返回有序集中指定區(qū)間內(nèi)的成員,通過索引左痢,分數(shù)從高到低
$redis->zAdd('key',0,'val0');
$redis->zAdd('key',2,'val2');
$redis->zAdd('key',10,'val10');
$redis->zRevRange('key',0,-1);
/* 輸出
array(3) {
[0]=>
string(5) "val10"
[1]=>
string(4) "val2"
[2]=>
string(4) "val0"
}
*/
$redis->zRevRange('key',0,-1, true);
/* 輸出
array(3) {
["val10"]=>
float(10)
["val2"]=>
float(2)
["val0"]=>
float(0)
}
*/
14. zRevRange - 返回有序集合中指定成員的排名靡羡,有序集成員按分數(shù)值遞減(從大到小)排序
$redis->zAdd('key',0,'val0');
$redis->zAdd('key',2,'val2');
$redis->zAdd('key',10,'val10');
$redis->zRevRange('key', 0,-1);
/* 輸出
array(3) {
[0]=>
string(5) "val10"
[1]=>
string(4) "val2"
[2]=>
string(4) "val0"
}
*/
$redis->zRevRange('key', 0,-1, true);
/* 輸出
array(3) {
["val10"]=>
float(10)
["val2"]=>
float(2)
["val0"]=>
float(0)
}
*/
15. zScore - 返回有序集中,成員的分數(shù)值
// 成功時返回成員分數(shù)俊性,失敗時返回 false
$redis->zScore('key','val10');
16. zUnionStore - 計算給定的一個或多個有序集的并集略步,并存儲在新的 key 中
$redis->del('k1');
$redis->del('k2');
$redis->del('k3');
$redis->del('ko1');
$redis->del('ko2');
$redis->del('ko3');
$redis->zAdd('k1', 0,'val0');
$redis->zAdd('k1', 1,'val1');
$redis->zAdd('k2', 2,'val2');
$redis->zAdd('k2', 3,'val3');
$redis->zUnionStore('ko1', array('k1','k2'));
var_dump($redis->zRange('ko1',0,-1));
/* 輸出
array(4) {
[0]=>
string(4) "val0"
[1]=>
string(4) "val1"
[2]=>
string(4) "val2"
[3]=>
string(4) "val3"
}
*/
// 該方法第三個參數(shù)是為每個給定的有序集合指定一個乘法因子, 每個給定有序集合的所有成員的score值在傳遞給聚合函數(shù)之前都要先乘以該因子
$redis->zUnionStore('ko2', array('k1','k2'),array(1,1));
var_dump($redis->zRange('ko2',0,-1));
/*
array(4) {
[0]=>
string(4) "val0"
[1]=>
string(4) "val1"
[2]=>
string(4) "val2"
[3]=>
string(4) "val3"
}
*/
$redis->zUnionStore('ko3', array('k1','k2'),array(5,1));
var_dump($redis->zRange('ko3',0,-1));
/* 輸出
array(4) {
[0]=>
string(4) "val0"
[1]=>
string(4) "val2"
[2]=>
string(4) "val3"
[3]=>
string(4) "val1"
}
*/
17. zscan - 用于迭代有序集合中的元素
$redis->zAdd('site', 1,'google', 2,'runoob',3,'taobao', 4,'weibo');
$iterator = null;
while ($members = $redis->zScan('site', $iterator)){
foreach ($members as $member=>$score){
echo $member . '=>' . $score . PHP_EOL;
}
}
// 輸出
/*
google=>1
runoob=>2
taobao=>3
weibo=>4
*/