redis原始碼分析(七)、redis命令學習總結—Redis 有序集合(sorted set)

後開啟撒打發了發表於2017-12-20

一、介紹

Redis 有序集合和集合一樣也是string型別元素的集合,且不允許重複的成員。 不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。 有序集合的成員是唯一的,但分數(score)卻可以重複。 集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可儲存40多億個成員)。

二、命令學習

1、Zadd

Redis Zadd 命令用於將一個或多個成員元素及其分數值加入到有序集當中。

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

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

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

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

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

用法:

redis 127.0.0.1:6379> ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN

返回值: 被成功新增的新成員的數量,不包括那些被更新的、已經存在的成員。

示例:

redis 127.0.0.1:6379> ZADD myset 1 "hello"
(integer) 1
redis 127.0.0.1:6379> ZADD myset 1 "foo"
(integer) 1
redis 127.0.0.1:6379> ZADD myset 2 "world" 3 "bar"
(integer) 2
redis 127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "hello"
2) "1"
3) "foo"
4) "1"
5) "world"
6) "2"
7) "bar"
8) "3"

2、Zcard

Redis Zcard 命令用於計算集合中元素的數量。

redis 127.0.0.1:6379> ZCARD KEY_NAME

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

示例:

redis 127.0.0.1:6379> ZADD myset 1 "hello"
(integer) 1
redis 127.0.0.1:6379> ZADD myset 1 "foo"
(integer) 1
redis 127.0.0.1:6379> ZADD myset 2 "world" 3 "bar"
(integer) 2
redis 127.0.0.1:6379> ZCARD myzset
(integer) 4

3、Zcount

Redis Zcount 命令用於計算有序集合中指定分數區間的成員數量。

redis 127.0.0.1:6379> ZCOUNT key min max

返回值:分數值在 min 和 max 之間的成員的數量。

示例:

redis 127.0.0.1:6379> ZADD myzset 1 "hello"
(integer) 1
redis 127.0.0.1:6379> ZADD myzset 1 "foo"
(integer) 1
redis 127.0.0.1:6379> ZADD myzset 2 "world" 3 "bar"
(integer) 2
redis 127.0.0.1:6379> ZCOUNT myzset 1 3
(integer) 4

4、Zincrby

Redis Zincrby 命令對有序集合中指定成員的分數加上增量 increment

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

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

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

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

用法:

redis 127.0.0.1:6379> ZINCRBY key increment member

示例:

127.0.0.1:6379> ZADD myzset 1 "hello"
(integer) 1
127.0.0.1:6379> ZADD myzset 1 "foo"
(integer) 1
127.0.0.1:6379> ZINCRBY myzset 2 "hello"
"3"
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "foo"
2) "1"
3) "hello"
4) "3"

5、Zinterstore

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

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

用法:

redis 127.0.0.1:6379> ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

返回值: 儲存到目標結果集的的成員數量。

示例:

# 有序集 mid_test
redis 127.0.0.1:6379> ZADD mid_test 70 "Li Lei"
(integer) 1
redis 127.0.0.1:6379> ZADD mid_test 70 "Han Meimei"
(integer) 1
redis 127.0.0.1:6379> ZADD mid_test 99.5 "Tom"
(integer) 1
 
# 另一個有序集 fin_test
redis 127.0.0.1:6379> ZADD fin_test 88 "Li Lei"
(integer) 1
redis 127.0.0.1:6379> ZADD fin_test 75 "Han Meimei"
(integer) 1
redis 127.0.0.1:6379> ZADD fin_test 99.5 "Tom"
(integer) 1
 
# 交集
redis 127.0.0.1:6379> ZINTERSTORE sum_point 2 mid_test fin_test
(integer) 3
 
# 顯示有序集內所有成員及其分數值
redis 127.0.0.1:6379> ZRANGE sum_point 0 -1 WITHSCORES     
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"

6、Zrange

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

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

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

如果你需要成員按

值遞減(從大到小)來排列,請使用 ZREVRANGE 命令。

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

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

用法:

redis 127.0.0.1:6379> ZRANGE key start stop [WITHSCORES]

返回值: 指定區間內,帶有分數值(可選)的有序整合員的列表。

示例:

redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES             # 顯示整個有序整合員
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"
 
redis 127.0.0.1:6379> ZRANGE salary 1 2 WITHSCORES              # 顯示有序集下標區間 1 至 2 的成員
1) "tom"
2) "5000"
3) "boss"
4) "10086"
 
redis 127.0.0.1:6379> 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)

7、Zrank

Redis Zrank 返回有序集中指定成員的排名。其中有序整合員按分數值遞增(從小到大)順序排列。

用法:

redis 127.0.0.1:6379> ZRANK key member

示例;

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

8、Zrem

Redis Zrem 命令用於移除有序集中的一個或多個成員,不存在的成員將被忽略。

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

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

用法:

redis 127.0.0.1:6379> ZRANK key member

示例:

# 測試資料
 
redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"
 
 
# 移除單個元素
 
redis 127.0.0.1:6379> ZREM page_rank google.com
(integer) 1
 
redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
 
 
# 移除多個元素
 
redis 127.0.0.1:6379> ZREM page_rank baidu.com bing.com
(integer) 2
 
redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
(empty list or set)
 
 
# 移除不存在元素
 
redis 127.0.0.1:6379> ZREM page_rank non-exists-element
(integer) 0

9、Zrangebylex

Redis Zrangebylex 通過字典區間返回有序集合的成員。

用法:

redis 127.0.0.1:6379> ZRANGEBYLEX key min max [LIMIT offset count]

示例:

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"

10、Zrangebyscore

Redis Zrangebyscore 返回有序集合中指定分數區間的成員列表。有序整合員按分數值遞增(從小到大)次序排列。

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

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

用法:

ZRANGEBYSCORE zset (1 5

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

ZRANGEBYSCORE zset (5 (10

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

redis 127.0.0.1:6379> ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回值: 指定區間內,帶有分數值(可選)的有序整合員的列表。

示例:

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"

11、Zscore

Redis Zscore 命令返回有序集中,成員的分數值。 如果成員元素不是有序集 key 的成員,或 key 不存在,返回 nil 。

用法:

redis 127.0.0.1:6379> ZSCORE key member

返回值: 成員的分數值,以字串形式表示

示例:

redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES    # 測試資料
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"
 
redis 127.0.0.1:6379> ZSCORE salary peter              # 注意返回值是字串
"3500"

相關文章