PHPRedis ZSET命令

weixin_34292287發表於2017-05-26

和Sets相比,Sorted Sets增加了一個權重引數score,使得集合中的元素能夠按score進行有序排列,

比如一個儲存全班同學成績的Sorted Sets,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。

案例:可以用SortedSets來做帶權重的佇列,比如普通訊息的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。

Zset型別它是set的一個升級版本,在set的基礎上增加了順序,這一屬性在新增修改元素時可以指定,每次指定後,zset會自動按新的值調整順序。


1.zAdd

將一個或多個member元素及其score值加入到有序集key當中。

如果某個member已經是有序集的成員,那麼更新這個member的score值,並通過重新插入這個member元素,來保證該member在正確的位置上。

score值可以是整數值或雙精度浮點數。

如果key不存在,則建立一個空的有序集並執行ZADD操作。

當key存在但不是有序集型別時,返回一個錯誤。

$redis->zAdd('key', 1, 'val1');

2.zRange

返回有序集key中,指定區間內的成員。

其中成員的位置按score值遞增(從小到大)來排序。

具有相同score值的成員按字典序(lexicographical order)來排列。

如果你需要成員按score值遞減(從大到小)來排列,請使用ZREVRANGE命令。

下標引數start和stop都以0為底,也就是說,以0表示有序集第一個成員,以1表示有序集第二個成員,以此類推。

你也可以使用負數下標,以-1表示最後一個成員,-2表示倒數第二個成員,以此類推。

超出範圍的下標並不會引起錯誤。

比如說,當start的值比有序集的最大下標還要大,或是start > stop時,ZRANGE命令只是簡單地返回一個空列表。

另一方面,假如stop引數的值比有序集的最大下標還要大,那麼Redis將stop當作最大下標來處理。

可以通過使用WITHSCORES選項,來讓成員和它的score值一併返回,返回列表以value1,score1, ..., valueN,scoreN的格式表示。

客戶端庫可能會返回一些更復雜的資料型別,比如陣列、元組等。

$redis->zAdd('key1', 0, 'val0');

$redis->zAdd('key1', 2, 'val2');

$redis->zAdd('key1', 10, 'val10');

$redis->zRange('key1', 0, -1); /* array('val0', 'val2', 'val10') */

// with scores

$redis->zRange('key1', 0, -1, true); /* array('val0' => 0, 'val2' => 2, 'val10' => 10) */

3.zRevRange

返回有序集key中,指定區間內的成員。

其中成員的位置按score值遞減(從大到小)來排列。

$redis->zAdd('key', 0, 'val0');

$redis->zAdd('key', 2, 'val2');

$redis->zAdd('key', 10, 'val10');

$redis->zRevRange('key', 0, -1); /* array('val10', 'val2', 'val0') */

// with scores

$redis->zRevRange('key', 0, -1, true); /* array('val10' => 10, 'val2' => 2, 'val0' => 0) */

4.zRangeByScore 從小到大

返回有序集key中,所有score值介於min和max之間(包括等於min或max)的成員。有序整合員按score值遞增(從小到大)次序排列。

具有相同score值的成員按字典序(lexicographical order)來排列(該屬性是有序集提供的,不需要額外的計算)。

可選的LIMIT引數指定返回結果的數量及區間(就像SQL中的SELECT LIMIT offset, count),注意當offset很大時,定位offset的操作可能需要遍歷整個有序集,此過程最壞複雜度為O(N)時間。

可選的WITHSCORES引數決定結果集是單單返回有序集的成員,還是將有序整合員及其score值一起返回。

該選項自Redis 2.0版本起可用。

$redis->zAdd('key', 0, 'val0');

$redis->zAdd('key', 2, 'val2');

$redis->zAdd('key', 3, 'val3');

$redis->zAdd('key', 10, 'val10');

$redis->zRangeByScore('key', 0, 3); /* array('val0', 'val2') */

$redis->zRangeByScore('key', 0, 3, array('withscores' => TRUE); /* array('val0' => 0, 'val2' => 2) */

$redis->zRangeByScore('key', 0, 3, array('limit' => array(1, 1)); /* array('val2' => 2) */

$redis->zRangeByScore('key', 0, 3, array('limit' => array(1, 1)); /* array('val2') */

$redis->zRangeByScore('key', 0, 3, array('withscores' => TRUE, 'limit' => array(1, 1)); /* array('val2' => 2) */

limit(X,Y),X是偏移量,Y是獲取數量

$redis->zRangeByScore('key', 0, 3, array('limit' => array(1, 1)); /* array('val2' => 2) */

假如'limit' => array(1, 1),偏移量為1,獲取數為1,就是獲取的結果集中,偏移一個結果,並獲取一個結果,結果為0 => string 'val2' (length=4)

'limit' => array(1, 1) 偏移量為1,獲取數為2,就是獲取的結果集中,偏移一個結果,並獲取一個結果,結果為0 => string 'val2' 1 => string 'val3' (length=4)

5.zRevRangeByScore

和上述的基本相同,但是就是從大到小

4.zDelete

從有序集合中刪除指定的成員。

$redis->zAdd('key', 0, 'val0');

$redis->zAdd('key', 2, 'val2');

$redis->zAdd('key', 10, 'val10');

$redis->zDelete('key', 'val2');

$redis->zRange('key', 0, -1); /* array('val0', 'val10') */

6.ZREM

移除有序集key中的一個或多個成員,不存在的成員將被忽略。

當key存在但不是有序集型別時,返回一個錯誤。

$redis->zrem(‘zset1′,’ef’); //true or false

7.zCard

返回有序集key的基數。

當key存在且是有序集型別時,返回有序集的基數。

當key不存在時,返回0。

$redis->zAdd('key', 0, 'val0');

$redis->zAdd('key', 2, 'val2');

$redis->zAdd('key', 10, 'val10');

$redis->zSize('key'); /* 3 */

8.zSize

返回儲存在key對應的有序集合中的元素的個數。

$redis->zAdd('key', 0, 'val0');

$redis->zAdd('key', 2, 'val2');

$redis->zAdd('key', 10, 'val10');

$redis->zSize('key'); /* 3 */

9.zCount

返回有序集key中,score值在min和max之間(預設包括score值等於min或max)的成員。

關於引數min和max的詳細使用方法,請參考ZRANGEBYSCORE命令。

score值在min和max之間的成員的數量。

$redis->zAdd('key', 0, 'val0');

$redis->zAdd('key', 2, 'val2');

$redis->zAdd('key', 10, 'val10');

$redis->zCount('key', 0, 3); /* 2, corresponding to array('val0', 'val2') */

10.zScore

返回有序集key中,成員member的score值。

如果member元素不是有序集key的成員,或key不存在,返回nil。

$redis->zAdd('key', 2.5, 'val2');

$redis->zScore('key', 'val2'); /* 2.5 */

11.zIncrBy

為有序集key的成員member的score值加上增量increment。

你也可以通過傳遞一個負數值increment,讓score減去相應的值,比如ZINCRBY key -5 member,就是讓member的score值減去5。

當key不存在,或member不是key的成員時,ZINCRBY key increment member等同於ZADD key increment member。

當key不是有序集型別時,返回一個錯誤。

score值可以是整數值或雙精度浮點數。

$redis->zIncrBy('key', 2.5, 'member1');

$redis->zIncrBy('key', 1, 'member1'); /* 3.5 */

12.zRank 從小到大,zRevRank從大到小

返回有序集key中成員member的排名。其中有序整合員按score值遞增(從小到大)順序排列。

排名以0為底,也就是說,score值最小的成員排名為0。

使用ZREVRANK命令可以獲得成員按score值遞減(從大到小)排列的排名。

如果member是有序集key的成員,返回member的排名。

如果member不是有序集key的成員,返回nil。

$redis->zAdd('key', 1, 'one');

$redis->zAdd('key', 2, 'two');

$redis->zRank('key', 'one'); /* 0 */

$redis->zRank('key', 'two'); /* 1 */

$redis->zRevRank('key', 'one'); /* 1 */

$redis->zRevRank('key', 'two'); /* 0 */

13.zRemRangeByRank/zDeleteRangeByRank

移除有序集key中,指定排名(rank)區間內的所有成員。

區間分別以下標引數start和stop指出,包含start和stop在內。

下標引數start和stop都以0為底,也就是說,以0表示有序集第一個成員,以1表示有序集第二個成員,以此類推。

你也可以使用負數下標,以-1表示最後一個成員,-2表示倒數第二個成員,以此類推。

被移除成員的數量。

$redis->zAdd('key', 1, 'one');

$redis->zAdd('key', 2, 'two');y', 3, 'three');

$redis->zRemRangeByRank('key', 0, 1); /* 2 */

$redis->zRange('key', 0, -1, array('withscores' => TRUE)); /* array('three' => 3) */

14.zRemRangeByScore

移除有序集key中,所有score值介於min和max之間(包括等於min或max)的成員。

自版本2.1.6開始,score值等於min或max的成員也可以不包括在內,詳情請參見ZRANGEBYSCORE命令。

被移除成員的數量。

$redis->zAdd('key', 0, 'val0');

$redis->zAdd('key', 2, 'val2');

$redis->zAdd('key', 10, 'val10');

$redis->zRemRangeByScore('key', 0, 3); /* 2 */

15.zUnion

對keys對應的numkeys個有序集合計算合集,並將結果儲存在destination中。在傳遞輸入keys之前必須提供輸入keys的個數和其它可選引數。在預設情況下,元素的結果score是包含該元素的所有有序集合中score的和。如果使用WEIGHTS選項,你可以對每一個有序集合指定一個操作因子。這意味著每一個有序集合中的每個元素的score在傳遞給聚合函式之前均會被乘以該因子。當WEIGHTS沒有指定時,操作因子預設為1。

使用AGGREGATE選項,你可以指定交集中的結果如何被聚合。該選項預設值為SUM,在這種情況下,一個元素的所有score值均會被相加。當選項被設定為MIN或MAX時,結果集合中將會包含一個元素的最大或者最小的score值。如果destination已經存在,那麼它將會被重寫。

$redis->zAdd('k1', 0, 'val0');

$redis->zAdd('k1', 1, 'val1');

$redis->zAdd('k2', 2, 'val2');

$redis->zAdd('k2', 3, 'val3');

$redis->zUnion('ko1', array('k1', 'k2')); /* 4, 'ko1' => array('val0', 'val1', 'val2', 'val3') */

/* Weighted zUnion */

$redis->zUnion('ko2', array('k1', 'k2'), array(1, 1)); /* 4, 'ko1' => array('val0', 'val1', 'val2', 'val3') */

$redis->zUnion('ko3', array('k1', 'k2'), array(5, 1)); /* 4, 'ko1' => array('val0', 'val2', 'val3', 'val1') */

16.zInter

計算給定的一個或多個有序集的交集,其中給定key的數量必須以numkeys引數指定,並將該交集(結果集)儲存到destination。

預設情況下,結果集中某個成員的score值是所有給定集下該成員score值之和。

關於WEIGHTS和AGGREGATE選項的描述,參見ZUNIONSTORE命令。

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

$redis->zInter('ko1', array('k1', 'k2'));              /* 2, 'ko1' => array('val1', 'val3') */

$redis->zInter('ko2', array('k1', 'k2'), array(1, 1));  /* 2, 'ko2' => array('val1', 'val3') */

/* Weighted zInter */

$redis->zInter('ko3', array('k1', 'k2'), array(1, 5), 'min'); /* 2, 'ko3' => array('val1', 'val3') */

$redis->zInter('ko4', array('k1', 'k2'), array(1, 5), 'max'); /* 2, 'ko4' => array('val3', 'val1') */

相關文章