Redis之有序集合(zset)類型命令


Redis 有序集合(sorted set)

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

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

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

集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員) 

使用場景 : 排行榜

 

zadd : 將一個或多個成員及成績加入有序集合,如果有分數則更新,分數可以是整型或者雙精度浮點,返回新增的成員數,已存在的不算,返回新增成員數

  •  xx   僅僅更新存在的成員,不添加新成員

  • nx    不更新存在的成員,只新增成員

  • incr  對成員進行遞增操作(zincrby)   返回遞增后的值

  • ch  返回改變的成員數(原始只返回新增成員數)

> zadd yhq 100 yhq 99 qhh 98 yjz 97 zhw
(integer) 4            #新增
> zadd yhq 101 qhh
(integer) 0            #修改
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "yhq"
6) 100.0
7) "qhh"
8) 102.0
> zadd yhq xx 666 yhq 777 ldy
(integer) 0             #僅更新
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "yhq"
8) 666.0
> zadd yhq nx 555 yhq  777 ldy
(integer) 1         #僅新增
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "yhq"
8) 666.0
9) "ldy"
10) 777.0
> zadd yhq incr 666 yhq
(integer) 1332       #遞增,返回遞增值
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "ldy"
8) 777.0
9) "yhq"
10) 1332.0
> zadd yhq ch 666 yhq 555 ymx
(integer) 2         #返回增加和修改的成員數(原始只返回新增數)
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "ymx"
8) 555.0
9) "yhq"
10) 666.0
11) "ldy"
12) 777.0

zcard : 獲取集合數量,否則返回0

127.0.0.1:6379> zcard cj
(integer) 2

zrange : 按索引獲取集合 按分數由小到大,相同分數按字典序排列 [withscores]

127.0.0.1:6379> zrange cj 0 -1
1) "yhq"
2) "qhh"
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yhq"
2) "98"
3) "qhh"
4) "99"

zrevrange : 按索引獲取集合 按分數由大到小,相同分數按字典序排列 [withscores]

127.0.0.1:6379> zrange myset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
127.0.0.1:6379> zrevrange myset 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrange myset 2 3
1) "one"
127.0.0.1:6379> zrevrange myset -2 -1
1) "two"
2) "one"

zrank : 獲取成員排名,由小到大

127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"
127.0.0.1:6379> zrank cj ys
(integer) 0

zrevrank : 獲取成員的排名,由大到小

127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yhq"
2) "98"
3) "qhh"
4) "99"
127.0.0.1:6379> zrange fs 0 -1 withscores
1) "qhh"
2) "100"
3) "yhq"
4) "100"
127.0.0.1:6379> zrevrank fs yhq
(integer) 0
127.0.0.1:6379> zrevrank fs qhh
(integer) 1
127.0.0.1:6379> zrevrank cj yhq
(integer) 1
127.0.0.1:6379> zrevrank cj qhh
(integer) 0

zcount : 返回指定分數區間內成員數

> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "ymx"
8) 555.0
9) "yhq"
10) 666.0
11) "ldy"
12) 777.0
zcount yhq -inf +inf    #最小最大
6
> zcount yhq (100 102    # 大於100小於等於102
1

zincrby : 對集合指定成員增加分數,可以是負數,不存在則添加,返回新的值,不是有序集合返回錯誤

127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yhq"
2) "98"
3) "qhh"
4) "99"
127.0.0.1:6379> zincrby cj -5 qhh
"94"
127.0.0.1:6379> zincrby cj -5 ys
"-5"
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"

zlexcount : 返回成員區間個數

  • 成員名稱前需要加 [ 符號作為開頭, [ 符號與成員之間不能有空格

  • 可以使用-和+表示最大最小值

  • 計算成員之間的成員數量時,min和max也計算在內

127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"
127.0.0.1:6379> zlexcount cj - +
(integer) 3

zscore : 返回集合成員分數

127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"
127.0.0.1:6379> zscore cj qh
(nil)
127.0.0.1:6379> zscore cj qhh
"94"

zrangebylex / zrevrangebylex : 根據正序/ 降序數據字典返回成員,分數必須相同(用戶電話排序,獲取某號段[號碼為k,v全部為0],獲取姓名A的所有人 [A (B)

  • 分數必須相同!!!,如果分數不一致,返回結果不准

  • 成員字符串作為二進制字節數比較,默認是ASCII字符集,如果包含utf8字符集,影響返回結果,建議不要使用

  • 默認情況下,max和min參數前必須加 [,與成員之間不能有空格(包含)  (不包含,+-表示最大最小,不能反,會導致結果空

127.0.0.1:6379> zadd zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1
(integer) 12
127.0.0.1:6379> zrangebylex zset - +
1) "a"
2) "aa"
3) "abc"
4) "apple"
5) "b"
6) "c"
7) "d"
8) "d1"
9) "dd"
10) "dobble"
11) "z"
12) "z1"
127.0.0.1:6379> zrangebylex zset [aa (c limit 3 2
1) "b"
127.0.0.1:6379> zrangebylex zset + - limit 3 2
(empty list or set)
127.0.0.1:6379> zrangebylex zset - + limit 3 2
1) "apple"
2) "b"

zrangebyscore : 按成績返回列表,由小到大,可以分頁

127.0.0.1:6379> zadd myset 1 "one"
(integer) 1
127.0.0.1:6379> zadd myset 2 "two"
(integer) 1
127.0.0.1:6379> zadd myset 3 "three"
(integer) 1
127.0.0.1:6379> zrangebyscore myset -inf +inf
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zrangebyscore myset 1 2
1) "one"
2) "two"

zrem : 移除一個或者多個成員

127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"
127.0.0.1:6379> zrem cj ys yy
(integer) 1
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "qhh"
2) "94"
3) "yhq"
4) "98"

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

 

  • 成員字符串作為二進制字節數比較,默認是ASCII字符集,如果包含utf8字符集,影響返回結果,建議不要使用

  • 默認情況下,max和min參數前必須加 [,與成員之間不能有空格(包含)  (不包含,+-表示最大最小,不能反,會導致結果空

 

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 [omega
(integer) 6
redis 127.0.0.1:6379> ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "zap"
4) "zip"

zremrangebyrank : 移除指定排名區間的成員,返回移除數量

127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yh"
2) "12"
3) "ys"
4) "45"
5) "qhh"
6) "94"
7) "yhq"
8) "98"
127.0.0.1:6379> zremrangebyrank cj 0 1
(integer) 2
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "qhh"
2) "94"
3) "yhq"
4) "98"

zremrangebyscore : 移除分數區間的成員

127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yh"
2) "12"
3) "ys"
4) "45"
5) "qhh"
6) "94"
7) "yhq"
8) "98"
127.0.0.1:6379> zremrangebyscore cj 30 50
(integer) 1
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yh"
2) "12"
3) "qhh"
4) "94"
5) "yhq"
6) "98"

zinterstore : 獲取多個集合的交集存到另一個集合         ZINTERSTORE  destination numkeys key [key ...] [WEIGHTS weight] [SUM|MIN|MAX]

在給定要計算的key和其他參數之前,必須先給定key的個數(numberkeys) 默認情況下,結果中一個元素的分數是有序集合該元素分數之和,前提是該元素在這些有序集合中都存在,如果destination存在則覆蓋

使用WEIGHTS選擇,為每個給定的有序集合指定一個乘法因子,在傳遞給聚合函數之前都先乘以該因子,沒有給定默認1

使用AGGREGATE選擇,給定聚合方式,默認sum,如果是min最小,max最大

127.0.0.1:6379> zadd zset1 1 "one"
(integer) 1
127.0.0.1:6379> zadd zset1 2 "two"
(integer) 1
127.0.0.1:6379> zadd zset2 1 "one"
(integer) 1
127.0.0.1:6379> zadd zset2 2 "two"
(integer) 1
127.0.0.1:6379> zinterstore out 2 zset1 zset2 weights 2 3
(integer) 2
127.0.0.1:6379> zrange out 0 -1 withscores
1) "one"
2) "5"   1*2+1*3
3) "two"  
4) "10"  2*2+2*3

zunionstore : 獲取多個集合的並集存到另一個集合  ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [SUM|MIN|MAX]

在給定要計算的key和其他參數之前,必須先給定key的個數(numberkeys) 默認情況下,結果中一個元素的分數是有序集合該元素分數之和,前提是該元素在這些有序集合中都存在,如果destination存在則覆蓋

使用WEIGHTS選擇,為每個給定的有序集合指定一個乘法因子,在傳遞給聚合函數之前都先乘以該因子,沒有給定默認1

使用AGGREGATE選擇,給定聚合方式,默認sum,如果是min最小,max最大

127.0.0.1:6379> zunionstore out 2 zset1 zset2 weights 2 3
(integer) 3
127.0.0.1:6379> zrange out 0 -1 withscores
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"

zpopmax / zpopmin : 刪除並返回有序集合key中最多個count個具有最高(低)分的成員,未指定count為1,大於集合基數不報錯,返回多個元素時,得分最高的元素將是第一個元素

127.0.0.1:6379> zrange zset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
127.0.0.1:6379> zpopmax zset 2
1) "four"
2) "4"
3) "three"
4) "3"
127.0.0.1:6379> zpopmin zset 2
1) "one"
2) "1"
3) "two"
4) "2"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM