redis原始碼分析(七)、redis命令學習總結—Redis 有序集合(sorted set)
一、介紹
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"
相關文章
- redis 有序集合(sorted set)(redis學習七)Redis
- redis原始碼分析(六)、redis命令學習總結—Redis 集合(Set)Redis原始碼
- Redis 有序集合(sorted set)Redis
- Redis的有序集合(sorted set)Redis
- Redis 入門指南九:Redis 有序集合(sorted set)Redis
- redis原始碼分析(四)、redis命令學習總結—連結串列ListRedis原始碼
- redis原始碼分析(三)redis命令學習總結—string字串Redis原始碼字串
- redis原始碼分析(五)、redis命令學習總結—雜湊HashRedis原始碼
- Redis有序集合學習Redis
- Redis有序集合命令Redis
- [Redis 系列]redis 學習四,set 集合,hash 雜湊,zset 有序集合初步認知Redis
- 【Redis 系列】redis 學習四,set 集合,hash 雜湊,zset 有序集合初步認知Redis
- redis學習之有序集合Redis
- Redis 入門 - 3(集合 set、有序集合 sort set)Redis
- redis有序集合型別sort setRedis型別
- 【Redis 系列】redis 學習十四,sorted_set 初步探究梳理Redis
- Redis 中的 set 和 sorted set 如何使用,原始碼實現分析Redis原始碼
- redis有序集合Redis
- Redis 有序集合Redis
- Redis 有序集合(zset)命令詳解Redis
- Redis-Redis實戰(有序集合)Redis
- Redis有序集合物件Redis物件
- Redis有序集合操作Redis
- Redis有序集合原理Redis
- redis原始碼分析之有序集SortedSetRedis原始碼
- (免費領取紅包封面)【Redis 系列】redis 學習四,set 集合,hash 雜湊,zset 有序集合初步認知Redis
- (免費領取紅包封面)[Redis 系列]redis 學習四,set 集合,hash 雜湊,zset 有序集合初步認知Redis
- redis原始碼分析(二)、sds動態字串學習總結Redis原始碼字串
- redis原始碼分析(9)redis原始碼連結串列學習總結 adlist.h adlist.cRedis原始碼
- Python&Redis 無序集合set、有序集合zset操作PythonRedis
- Redis有序集合詳解Redis
- Redis物件——有序集合(ZSet)Redis物件
- 《Redis實戰》筆記-Redis的有序集合Redis筆記
- redis學習總結Redis
- Redis探索之旅(10)- Redis資料結構之有序集合Redis資料結構
- redis原始碼學習Redis原始碼
- redis命令總結Redis
- php操作redis,有序集合zsetPHPRedis