Redis資料結構詳解之Zset(五)

張龍豪發表於2015-11-27

序言

Zset跟Set之間可以有並集運算,因為他們儲存的資料字串集合,不能有一樣的成員出現在一個zset中,但是為什麼有了set還要有zset呢?zset叫做有序集合,而set是無序的,zset怎麼做到有序的呢?就是zset的每一個成員都有一個分數與之對應,並且分數是可以重複的。有序集合的增刪改由於有啦排序,執行效率就是非常快速的,即便是訪問集合中間的資料也是非常高效的。

下面我來展示下操作zset的redis命令

操作單個zset的redis命令

1、新增,如果值存在新增,將會重新排序。zadd

127.0.0.1:6379>zadd myZSet 1 zlh   ---新增分數為1,值為zlh的zset集合

127.0.0.1:6379>zadd mySet 2 Tom 3 Jim   ---新增2條zset集合,分別為分數為2、3,值為tom、jim的集合。

2、檢視zset集合的成員個數。zcard

127.0.0.1:6379>zcard myZSet   ---輸出zset的成員個數為3

3、檢視Zset指定範圍的成員,withscores為輸出結果帶分數。zrange

127.0.0.1:6379>zrange mZySet 0 -1   ----0為開始,-1為結束,輸出順序結果為: zlh tom jim

127.0.0.1:6379>zrange mZySet 0 -1 withscores   ---輸出帶分數的結果為:zlh 1 tom 2 jim 3

4、獲取zset成員的下標位置,如果值不存在返回null。zrank

127.0.0.1:6379>zrank mZySet Jim    ---Jim的在zset集合中的下標為2

5、獲取zset集合指定分數之間存在的成員個數。zcount

127.0.0.1:6379>zcount mySet 1 3   ---輸出分數>=1 and 分數 <=3的成員個數為3,因為分數是可以重複的,所以這個命令是有道理的。

6、刪除指定的一個成員或多個成員。zrem

127.0.0.1:6379>zrem myZSet zlh   --刪除值為zlh的zset成員

127.0.0.1:6379>zrem myZSet Tom Jim    ---刪除值為Tom和Jim的兩個zset成員

7、獲取指定值的分數。zscore

127.0.0.1:6379>zadd myZset 1 zlh 1 tom 2 jim 3 xdd 4 pmm   ---由於上面的資料被刪除完了,這裡新增5條示範資料再。

127.0.0.1:6379>zscore myZset zlh    ---輸出值為zlh的分數為1

8、給指定元素的分數進行增減操作,負值為減,正值為加。zincrby

127.0.0.1:6379>zscore myZset tom    ----輸出tom的分數為1

127.0.0.1:6379>zincrby myZset 4 tom   ---tom的分數值加4,輸入分數值為5

127.0.0.1:6379>zscore myZset tom    ---輸出tom的分數值為5

9、根據指定分數的範圍獲取值。zrangebysocre

127.0.0.1:6379>zrangebyscore myZset  1 5   ---輸出分數>=1 and <=5的成員值為:zlh jim xdd pmm  tom

127.0.0.1:6379>zrangebyscore myZset  (1 5    ----輸出分數>1 and <=5的成員值為:jim xdd pmm tom

127.0.0.1:6379>zrangebyscore myZset 2 5 limit 1 2    ---檢索分數為2到5之間的資料,然後從下標為1的資料開始往後輸出2個資料,包含下標為1的資料。結果為:xdd pmm

127.0.0.1:6379>zrangebyscore myZset -inf +inf limit 2 3   ----+inf表示最後一個成員,-inf表示第一個成員,意思是:檢索所有資料,然後從下標為2的資料開始再往後輸出2個資料。結果為:xdd pmm tom

10、倒序,從高到底排序輸出指定範圍的資料。zrevrange,zrevrangebyscore

127.0.0.1:6379>zrevrange myZset 2 3   ---先倒序排列資料,輸出下標為>=2 and <=3的資料為xdd jim,這裡注意的是倒序之後下標也反過來了。

127.0.0.1:6379>zrevrange myZset 2 4 withscores    ---輸出結果為:xdd 3 jim 2 zlh 1

127.0.0.1:6379>zrevrangebyscore myZset 5 1 limit  3 2  ----輸出結果為:jim zlh 。獲取score <=5 and >=1,從下標為為3開始獲取2條資料。

127.0.0.1:6379>zrevrangebyscore myZset 4 2   ----分數>=2 and <=4 的資料倒序輸出:pmm xdd jim

11、根據座標,分數範圍刪除資料。zremrangebyscore,zremrangebyrank

127.0.0.1:6379>zremrangebyscore myZset 1 2   ---刪除分數>=1 and <=2的資料

127.0.0.1:6379>zrange myZset 0 -1    ----輸出結果為 xdd pmm tom

127.0.0.1:6379>zremrangebyrank myZset 0 2    ---刪除下標>=0 and <=2的zset元素

127.0.0.1:6379>zrange myZset 0 -1    --輸出結果為:empty list or set 。沒資料啦。

操作多個zset的redis命令

1、求多個zset的並集

127.0.0.1:6379>zadd myZset 1 zlh 2 jim 3 tom   ---新增3個資料

127.0.0.1:6379>zadd youZset 1 zlh 2 xdd 3 pmm    ---新增3個資料

127.0.0.1:6379>zunionzstore heZset 2 myZset youZset  ----將myzset和youzset的並集新增到hezset中。

2、求多個zset的交集

127.0.0.1:6379>zinterstore sheZset 2 myZset youZset  ----將myzset和youZset 的交集新增到sheZset中。

小結

如果你在看到本文後有什麼疑問,請加入部落格左上角群,一起交流學習。

我的redis系列博文:雙擊地址

相關文章