上文中介紹了Redis中的Set集合,Set集合是無序的不可重複的。而我們本文要介紹的ZSet其實是在Set的基礎上綁定了一個score來實作集合資料按照score排序的集合。
有序集合和集合一樣也是string類型元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重複。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMjZWNihDZ0kTMhVTOlFWO2QjY0M2MkVWM2UzNlJGZ18CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
ZAdd
向有序集合中添加一個或者多個元素(分數/元素),如果元素已經存在,則更新該元素的分數,并調整到對應的位置。按分數從小到大排列
127.0.0.1:6379> zadd student 60 a1 70 a2 80 a3 90 a4
(integer) 4
ZScore
擷取有序集合中元素對應的分數值
127.0.0.1:6379> zscore student a1
"60"
127.0.0.1:6379> zscore student a4
"90"
ZRange
擷取集合中指定的元素資訊,如果加上withscores參數則會連同分數一并傳回
127.0.0.1:6379> zrange student 0 -1
1) "a1"
2) "a2"
3) "a3"
4) "a4"
127.0.0.1:6379> zrange student 0 -1 withscores
1) "a1"
2) "60"
3) "a2"
4) "70"
5) "a3"
6) "80"
7) "a4"
8) "90"
ZRevRange
和zrange指令類似,隻是結果倒序顯示
127.0.0.1:6379> zrevrange student 0 3
1) "a4"
2) "a3"
3) "a2"
4) "a1"
127.0.0.1:6379> zrevrange student 0 3 withscores
1) "a4"
2) "90"
3) "a3"
4) "80"
5) "a2"
6) "70"
7) "a1"
8) "60"
ZCard
傳回集合中元素的個數
127.0.0.1:6379> zcard student
(integer) 4
ZCount
統計集合中元素的分數在min和max之間的個數,如果不需要保持min或者max,在其前面加(即可,如下
127.0.0.1:6379> zcount student 60 90
(integer) 4
127.0.0.1:6379> zcount student 60 (90
(integer) 3
127.0.0.1:6379> zcount student (60 90
(integer) 3
127.0.0.1:6379> zcount student (60 (90
(integer) 2
ZRangeByScore
可以根據score範圍來查找集合中的元素,加上withscores也可以一并查詢出對應的分數。
127.0.0.1:6379> zrangebyscore student 60 90
1) "a1"
2) "a2"
3) "a3"
4) "a4"
127.0.0.1:6379> zrangebyscore student 60 90 withscores
1) "a1"
2) "60"
3) "a2"
4) "70"
5) "a3"
6) "80"
7) "a4"
8) "90"
127.0.0.1:6379> zrangebyscore student (60 (90 withscores
1) "a2"
2) "70"
3) "a3"
4) "80"
ZRank
擷取元素在集合中的排名,從小到大排序,最小的排名是0,不存在的傳回 nil
127.0.0.1:6379> zrank student a3
(integer) 2
127.0.0.1:6379> zrank student a66
(nil)
127.0.0.1:6379> zrank student a1
(integer) 0
ZRevRank
擷取元素在集合中的排名,從大到小排名,和ZRank指令剛好相反
127.0.0.1:6379> zrevrank student a3
(integer) 1
127.0.0.1:6379> zrevrank student a1
(integer) 3
ZIncrBy
給集合中的元素增加分數,如果元素不存在則建立元素,并設定分數初始為0然後在增加設定的分數。
127.0.0.1:6379> zrange student 0 -1 withscores
1) "a1"
2) "60"
3) "a2"
4) "70"
5) "a3"
6) "80"
7) "a4"
8) "90"
127.0.0.1:6379> zincrby student 5 a1
"65"
127.0.0.1:6379> zrange student 0 -1 withscores
1) "a1"
2) "65"
3) "a2"
4) "70"
5) "a3"
6) "80"
7) "a4"
8) "90"
127.0.0.1:6379> zincrby student 5 aa
"5"
127.0.0.1:6379> zrange student 0 -1 withscores
1) "aa"
2) "5"
3) "a1"
4) "65"
5) "a2"
6) "70"
7) "a3"
8) "80"
9) "a4"
10) "90"
ZInterStore
計算給定的一個或多個有序集的交集并将結果集存儲在新的有序集合 key 中
127.0.0.1:6379> zadd s1 2 a1 3 a2 4 a3
(integer) 3
127.0.0.1:6379> zadd s2 5 a1 6 a4 7 a3
(integer) 3
127.0.0.1:6379> zinterstore s3 2 s1 s2
(integer) 2
127.0.0.1:6379> zrange s3 0 -1 withscores
1) "a1"
2) "7"
3) "a3"
4) "11"
還可以在指令後跟上權重值,score會乘以該權重值。
127.0.0.1:6379> zinterstore s5 2 s1 s2 weights 3 1
(integer) 2
127.0.0.1:6379> zrange s5 0 -1 withscores
1) "a1"
2) "11"
3) "a3"
4) "19"
ZRem
從集合中彈出一個元素
127.0.0.1:6379> zrange s5 0 -1 withscores
1) "a1"
2) "11"
3) "a3"
4) "19"
127.0.0.1:6379> zrem s5 a1
(integer) 1
127.0.0.1:6379> zrange s5 0 -1 withscores
1) "a3"
2) "19"
ZLexCount
計算有序集合中指定字典區間内成員數量
127.0.0.1:6379> zadd myzset 0 a 0 b 0 c 0 d 0 e 0 f
(integer) 6
127.0.0.1:6379> zlexcount myzset - +
(integer) 6
127.0.0.1:6379> zlexcount myzset [b [e
(integer) 4
注意 -+表示最小值和最大值,如果我們需要通過元素查找的話需要加[。
ZRangeByLex
擷取集合中指定成員區間的元素
127.0.0.1:6379> zlexcount myzset1 - +
(integer) 5
127.0.0.1:6379> zlexcount myzset1 [b [e
(integer) 4
127.0.0.1:6379> zrangebylex myzset [b [e
1) "b"
2) "c"
3) "d"
4) "e"
~好了本文到此為止