1. 程式人生 > >Redis常用操作--------SortedSet(有序集合)

Redis常用操作--------SortedSet(有序集合)

1.ZADD key score member [[score member] [score member] ...]

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

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

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

如果 key

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

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

在 Redis 2.4 版本以前, ZADD 每次只能新增一個元素。

可用版本:
>= 1.2.0
時間複雜度:
O(M*log(N)),  N 是有序集的基數,  M 為成功新增的新成員的數量。
返回值:
被成功新增的新成員的數量,不包括那些被更新的、已經存在的成員。
# 新增單個元素

redis> ZADD page_rank 10 google.com
(integer) 1


# 新增多個元素

redis> ZADD page_rank 9 baidu.com 8 bing.com
(integer) 2

redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 新增已存在元素,且 score 值不變

redis> ZADD page_rank 10
google.com (integer) 0 redis> ZRANGE page_rank 0 -1 WITHSCORES # 沒有改變 1) "bing.com" 2) "8" 3) "baidu.com" 4) "9" 5) "google.com" 6) "10" # 新增已存在元素,但是改變 score 值 redis> ZADD page_rank 6 bing.com (integer) 0 redis> ZRANGE page_rank 0 -1 WITHSCORES # bing.com 元素的 score 值被改變 1) "bing.com" 2) "6" 3) "baidu.com" 4) "9" 5) "google.com" 6) "10"

 

 

2.ZCARD key

返回有序集 key 的基數。

可用版本:
>= 1.2.0
時間複雜度:
O(1)
返回值:
當  key 存在且是有序集型別時,返回有序集的基數。 當  key 不存在時,返回  0 。    

3.ZCOUNT key min max

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

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

可用版本:
>= 2.0.0
時間複雜度:
O(log(N)+M),  N 為有序集的基數,  M 為值在  min 和  max 之間的元素的數量。
返回值:
score 值在  min 和  max 之間的成員的數量。

 

4.ZINCRBY key increment member

為有序集 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 值可以是整數值或雙精度浮點數。

可用版本:
>= 1.2.0
時間複雜度:
O(log(N))
返回值:
member 成員的新  score 值,以字串形式表示。

5.ZRANGE key start stop [WITHSCORES]

返回有序集 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 的格式表示。 客戶端庫可能會返回一些更復雜的資料型別,比如陣列、元組等。
可用版本:
>= 1.2.0
時間複雜度:
O(log(N)+M),  N 為有序集的基數,而  M 為結果集的基數。
返回值:
指定區間內,帶有  score 值(可選)的有序整合員的列表。
redis > ZRANGE salary 0 -1 WITHSCORES             # 顯示整個有序整合員
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"

redis > ZRANGE salary 1 2 WITHSCORES              # 顯示有序集下標區間 12 的成員
1) "tom"
2) "5000"
3) "boss"
4) "10086"

redis > ZRANGE salary 0 200000 WITHSCORES         # 測試 end 下標超出最大下標時的情況
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"

redis > ZRANGE salary 200000 3000000 WITHSCORES   # 測試當給定區間不存在於有序集時的情況
(empty list or set)

 

 

6.ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回有序集 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 版本起可用。

區間及無限

min 和 max 可以是 -inf 和 +inf ,這樣一來,你就可以在不知道有序集的最低和最高 score 值的情況下,使用 ZRANGEBYSCORE 這類命令。

預設情況下,區間的取值使用閉區間 (小於等於或大於等於),你也可以通過給引數前增加 ( 符號來使用可選的開區間 (小於或大於)。

舉個例子:

ZRANGEBYSCORE zset (1 5

返回所有符合條件 score <= 5 的成員,而

ZRANGEBYSCORE zset (5 (10

則返回所有符合條件 score 10 的成員。

可用版本:
>= 1.0.5
時間複雜度:
O(log(N)+M),  N 為有序集的基數,  M 為被結果集的基數。
返回值:
指定區間內,帶有  score 值(可選)的有序整合員的列表。
redis> ZADD salary 2500 jack                        # 測試資料
(integer) 0
redis> ZADD salary 5000 tom
(integer) 0
redis> ZADD salary 12000 peter
(integer) 0

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

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

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

redis> ZRANGEBYSCORE salary (5000 400000            # 顯示工資大於 5000 小於等於 400000 的成員
1) "peter"

 

 

7.ZRANK key member

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

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

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

可用版本:
>= 2.0.0
時間複雜度:
O(log(N))
返回值:
如果  member 是有序集  key 的成員,返回  member 的排名。 如果  member 不是有序集  key 的成員,返回  nil 。
redis> ZRANGE salary 0 -1 WITHSCORES        # 顯示所有成員及其 score 值
1) "peter"
2) "3500"
3) "tom"
4) "4000"
5) "jack"
6) "5000"

redis> ZRANK salary tom                     # 顯示 tom 的薪水排名,第二
(integer) 1

 

 

 

8.ZREM key member [member ...]

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

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

在 Redis 2.4 版本以前, ZREM 每次只能刪除一個元素。

可用版本:
>= 1.2.0
時間複雜度:
O(M*log(N)),  N 為有序集的基數,  M 為被成功移除的成員的數量。
返回值:
被成功移除的成員的數量,不包括被忽略的成員。

 

 

9.ZREMRANGEBYRANK key start stop

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

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

下標引數  start 和  stop 都以  0 為底,也就是說,以  0 表示有序集第一個成員,以  1 表示有序集第二個成員,以此類推。 你也可以使用負數下標,以  -1 表示最後一個成員,  -2 表示倒數第二個成員,以此類推。
可用版本:
>= 2.0.0
時間複雜度:
O(log(N)+M),  N 為有序集的基數,而  M 為被移除成員的數量。
返回值:
被移除成員的數量。
redis> ZADD salary 2000 jack
(integer) 1
redis> ZADD salary 5000 tom
(integer) 1
redis> ZADD salary 3500 peter
(integer) 1

redis> ZREMRANGEBYRANK salary 0 1       # 移除下標 01 區間內的成員
(integer) 2

redis> ZRANGE salary 0 -1 WITHSCORES    # 有序集只剩下一個成員
1) "tom"
2) "5000"

 

10.ZREMRANGEBYSCORE key min max

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

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

可用版本:
>= 1.2.0
時間複雜度:
O(log(N)+M),  N 為有序集的基數,而  M 為被移除成員的數量。
返回值:
被移除成員的數量。

 

ZREVRANGE key start stop [WITHSCORES]

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

其中成員的位置按  score 值遞減(從大到小)來排列。 具有相同  score 值的成員按字典序的逆序(reverse lexicographical order)排列。

除了成員按 score 值遞減的次序排列這一點外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一樣。

可用版本:
>= 1.2.0
時間複雜度:
O(log(N)+M),  N 為有序集的基數,而  M 為結果集的基數。
返回值:
指定區間內,帶有  score 值(可選)的有序整合員的列表。

 

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

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

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

除了成員按 score 值遞減的次序排列這一點外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一樣。

可用版本:
>= 2.2.0
時間複雜度:
O(log(N)+M),  N 為有序集的基數,  M 為結果集的基數。
返回值:
指定區間內,帶有  score 值(可選)的有序整合員的列表。

 

11.ZREVRANK key member

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

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

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

可用版本:
>= 2.0.0
時間複雜度:
O(log(N))
返回值:
如果  member 是有序集  key 的成員,返回  member 的排名。 如果  member 不是有序集  key 的成員,返回  nil 。    

12.ZSCORE key member

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

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

可用版本:
>= 1.2.0
時間複雜度:
O(1)
返回值:
member 成員的  score 值,以字串形式表示。

 

 

13.ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

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

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

WEIGHTS

使用 WEIGHTS 選項,你可以為 每個 給定有序集 分別 指定一個乘法因子(multiplication factor),每個給定有序集的所有成員的 score值在傳遞給聚合函式(aggregation function)之前都要先乘以該有序集的因子。

如果沒有指定 WEIGHTS 選項,乘法因子預設設定為 1 。

AGGREGATE

使用 AGGREGATE 選項,你可以指定並集的結果集的聚合方式。

預設使用的引數 SUM ,可以將所有集合中某個成員的 score 值之 和 作為結果集中該成員的 score 值;使用引數 MIN ,可以將所有集合中某個成員的 最小 score 值作為結果集中該成員的 score 值;而引數 MAX 則是將所有集合中某個成員的 最大 score 值作為結果集中該成員的 score 值。

可用版本:
>= 2.0.0
時間複雜度:
O(N)+O(M log(M)),  N 為給定有序集基數的總和,  M 為結果集的基數。
返回值:
儲存到  destination 的結果集的基數。
redis> ZRANGE programmer 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"

redis> ZRANGE manager 0 -1 WITHSCORES
1) "herry"
2) "2000"
3) "mary"
4) "3500"
5) "bob"
6) "4000"

redis> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3   # 公司決定加薪。。。除了程式設計師。。。
(integer) 6

redis> ZRANGE salary 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
7) "herry"
8) "6000"
9) "mary"
10) "10500"
11) "bob"
12) "12000"

 

 

14.ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

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

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

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

可用版本:
>= 2.0.0
時間複雜度:
O(N*K)+O(M*log(M)),  N 為給定  key 中基數最小的有序集,  K 為給定有序集的數量,  M 為結果集的基數。
返回值:
儲存到  destination 的結果集的基數。
redis > ZADD mid_test 70 "Li Lei"
(integer) 1
redis > ZADD mid_test 70 "Han Meimei"
(integer) 1
redis > ZADD mid_test 99.5 "Tom"
(integer) 1

redis > ZADD fin_test 88 "Li Lei"
(integer) 1
redis > ZADD fin_test 75 "Han Meimei"
(integer) 1
redis > ZADD fin_test 99.5 "Tom"
(integer) 1

redis > ZINTERSTORE sum_point 2 mid_test fin_test
(integer) 3

redis > ZRANGE sum_point 0 -1 WITHSCORES     # 顯示有序集內所有成員及其 score 值
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"