php redis 擴展類常用操作(6)- sorted set

七. 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
*/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末定页,一起剝皮案震驚了整個濱河市趟薄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌典徊,老刑警劉巖杭煎,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恩够,死亡現(xiàn)場離奇詭異,居然都是意外死亡羡铲,警方通過查閱死者的電腦和手機蜂桶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來也切,“玉大人屎飘,你說我怎么就攤上這事〖址眩” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵檐盟,是天一觀的道長褂萧。 經(jīng)常有香客問我,道長葵萎,這世上最難降的妖魔是什么导犹? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮羡忘,結(jié)果婚禮上谎痢,老公的妹妹穿的比我還像新娘。我一直安慰自己卷雕,他們只是感情好节猿,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漫雕,像睡著了一般滨嘱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浸间,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天太雨,我揣著相機與錄音,去河邊找鬼魁蒜。 笑死囊扳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的兜看。 我是一名探鬼主播锥咸,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铣减!你這毒婦竟也來了她君?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤葫哗,失蹤者是張志新(化名)和其女友劉穎缔刹,沒想到半個月后球涛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡校镐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年亿扁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟廓。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡从祝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出引谜,到底是詐尸還是另有隱情牍陌,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布员咽,位于F島的核電站毒涧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贝室。R本人自食惡果不足惜契讲,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滑频。 院中可真熱鬧捡偏,春花似錦、人聲如沸峡迷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绘搞。三九已至枣申,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間看杭,已是汗流浹背忠藤。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留楼雹,地道東北人模孩。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像贮缅,于是被迫代替她去往敵國和親榨咐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容