Redis 有序集合(sorted set)

木偶跳舞發表於2016-05-24

Redis 有序集合(sorted set)

Redis 有序集合和集合一樣也是string型別元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

有序集合的成員是唯一的,但分數(score)卻可以重複。

集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可儲存40多億個成員)。


例項

redis 127.0.0.1:6379> ZADD w3ckey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD w3ckey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD w3ckey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE w3ckey 0 10 WITHSCORES

1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"

在以上例項中我們通過命令 ZADD 向 redis 的有序集合中新增了三個值並關聯上分數。


Redis 有序集合命令

下表列出了 redis 有序集合的基本命令:

1、ZADD key score1 value1 [score2 value2] 
   將一個或多個成員元素及其分數值加入到有序集當中。
如果某個成員已經是有序集的成員,那麼更新這個成員的分數值,並通過重新插入這個成員元素,來保證該成員在正確的位置上。
分數值可以是整數值或雙精度浮點數。如果有序集合 key 不存在,則建立一個空的有序集並執行 ZADD 操作。當 key 存在但不是有序集型別時,返回一個錯誤。
例:redis 127.0.0.1:6379> ZADD myset 2 "world" 3 "bar"
                              (integer) 2 
2    zcard  key 
    獲取有序集合的成員個數,當 key 存在且是有序集型別時,返回有序集的成員個數。 當 key 不存在時,返回 0 。
3    zcount  key  min  max 
    計算在有序集合中指定區間分數的成員個數,分數值在 min 和 max 之間的成員的數量。
4    zincrby  key  increment  member 
    有序集合中對指定成員的分數加上增量 increment , 可以通過傳遞一個負數值 increment ,讓分數減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。當 key 不存在,或分數不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member 。
當 key 不是有序集型別時,返回一個錯誤。
分數值可以是整數值或雙精度浮點數。

5    zinterstore  destination  numkeys  key  [key ...] 
計算給定的一個或多個有序集的交集並將結果集儲存在新的有序集合destination  中,其中給定 key 的數量必須以 numkeys 引數指定,並將該交集(結果集)儲存到 destination 。預設情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和(交的是集合成員)。
6    zlexcount  key  min  max 
在有序集合中計算指定字典區間內成員數量,分數小的成員放前邊,成員前有中括號

例:

<span style="font-size:18px;">redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
redis 127.0.0.1:6379> ZADD myzset 0 f 0 g
(integer) 2
redis 127.0.0.1:6379> ZLEXCOUNT myzset - +
(integer) 7
redis 127.0.0.1:6379> ZLEXCOUNT myzset [b [f
(integer) 5</span>

7    zrange  key  start  stop  [withscores] 
通過索引區間返回有序集合成指定區間內的成員,Redis Zrange 返回有序集中(升序),指定區間內的成員。
其中成員的位置按分數值遞增(從小到大)來排序。具有相同分數值的成員按字典序(lexicographical order )來排列。
如果你需要成員按值遞減(從大到小)來排列,請使用 zrevrange 命令。下標引數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。你也可以使用負數下標,以 -1 表示最後一個成員, -2 表示倒數第二個成員,以此類推。帶withscores顯示集合成員及其分數,不帶則只顯示集合成員。

例:

<span style="font-size:18px;">redis 127.0.0.1:6379> ZRANGE salary 1 2 WITHSCORES              # 顯示有序集下標區間 1 至 2 的成員
1) "tom"
2) "5000"
3) "boss"
4) "10086"</span>

8    zrangebylex  key  min  max  [limit  offset  count] 
通過字典區間返回有序集合的成員

例:

<span style="font-size:18px;">redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
redis> </span>
注意中括號和小括號的區別,中括號包含,小括號不包含

9    zrangebyscore  key  min  max  [withscores]  [limit
通過分數返回有序集合指定區間內的成員,有序整合員按分數值遞增(從小到大)次序排列。
具有相同分數值的成員按字典序來排列(該屬性是有序集提供的,不需要額外的計算)。
預設情況下,區間的取值使用閉區間 (小於等於或大於等於),你也可以通過給引數前增加 ( 符號來使用可選的開區間 (小於或大於)。

例:

<span style="font-size:18px;">redis 127.0.0.1:6379> ZADD salary 2500 jack                        # 測試資料
(integer) 0
redis 127.0.0.1:6379> ZADD salary 5000 tom
(integer) 0
redis 127.0.0.1:6379> ZADD salary 12000 peter
(integer) 0

redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf               # 顯示整個有序集
1) "jack"
2) "tom"
3) "peter"

redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf WITHSCORES    # 顯示整個有序集及成員的 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"

redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES    # 顯示工資 <=5000 的所有成員
1) "jack"
2) "2500"
3) "tom"
4) "5000"

redis 127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000            # 顯示工資大於 5000 小於等於 400000 的成員
1) "peter"</span>

10    zrank  key  member
返回有序集合中指定成員的索引,返回有序集中指定成員的排名。其中有序整合員按分數值遞增(從小到大)順序排列。例:

<span style="font-size:18px;">redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES        # 顯示所有成員及其 score 值
1) "peter"
2) "3500"
3) "tom"
4) "4000"
5) "jack"
6) "5000"

redis 127.0.0.1:6379> ZRANK salary tom                     # 顯示 tom 的薪水排名,第二
(integer) 1</span>

11    zrem  key  member  [member ...] 
移除有序集合中的一個或多個成員,Redis Zrem 命令用於移除有序集中的一個或多個成員,不存在的成員將被忽略。當 key 存在但不是有序集型別時,返回一個錯誤。
12    zremrangebylex  key  min  max 

移除有序集合中給定的字典區間的所有成員,例:

redis 127.0.0.1:6379> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e
(integer) 5
redis 127.0.0.1:6379> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha
(integer) 5
redis 127.0.0.1:6379> ZRANGE myzset 0 -1
1) "ALPHA"
 2) "aaaa"
 3) "alpha"
 4) "b"
 5) "c"
 6) "d"
 7) "e"
 8) "foo"
 9) "zap"
10) "zip"
redis 127.0.0.1:6379> ZREMRANGEBYLEX myzset [alpha [foo
(integer) 6
redis 127.0.0.1:6379> ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "zap"
4) "zip"
redis> 

13    zremrangebyrank  key  start  stop 
移除有序集合中給定的排名區間的所有成員
14    zremrangebyscore  key  min  max 
移除有序集合中給定的分數區間的所有成員
15    zrevrange   key   start   stop   [WITHSCORES] 

返回有序集中指定區間內的成員,通過索引,分數從高到底,具有相同分數值的成員按字典序的逆序(reverse lexicographical order)排列。除了成員按分數值遞減的次序排列這一點外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一樣。例:

redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES        # 遞增排列
1) "peter"
2) "3500"
3) "tom"
4) "4000"
5) "jack"
6) "5000"

redis 127.0.0.1:6379> ZREVRANGE salary 0 -1 WITHSCORES     # 遞減排列
1) "jack"
2) "5000"
3) "tom"
4) "4000"
5) "peter"
6) "3500"

16    zrevrangebyscore   key   max   min   [WITHSCORES] 
返回有序集中指定分數區間內的成員,分數從高到低排序
17    zrevrank  key  member 
返回有序集合中指定成員的排名,有序整合員按分數值遞減(從大到小)排序
18   zscore  key  member 
返回有序集中,成員的分數值,如果成員元素不是有序集 key 的成員,或 key 不存在,返回 nil 。
19    zunionstore  destination  numkeys  key  [key ...] 
計算給定的一個或多個有序集的並集,其中給定 key 的數量必須以 numkeys 引數指定,並將該並集(結果集)儲存到 destination 。預設情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和 。
20    zscan  key  cursor  [MATCH pattern]  [COUNT count] 
迭代有序集合中的元素(包括元素成員和元素分值),返回的每個元素都是一個有序集合元素,一個有序集合元素由一個成員(member)和一個分值(score)組成。


相關文章