Redis系列-存儲篇sorted set主要操作函數小結

redis支持有序集合,即sorted set。sorted set在set的基礎上,增加了排序屬性,是set的升級版。這裏簡要談談sorted set的常用函數:

1)insert

a)  zadd

語法:zadd key score member [[score member] [score member] ...]

解釋:增加一個或多個member【根據score排序】到有序集key中,如果member已經存在,只更新score。返回增加member個數,不包含已經存在的member

[root@xsf001 ~]# redis-cli 
redis 127.0.0.1:6379> ZADD score 230 zhangsan
(integer) 1
redis 127.0.0.1:6379> zadd score 240 lisi 250 wangwu
(integer) 2
redis 127.0.0.1:6379> zadd score 100 liuli
redis 127.0.0.1:6379> zadd score 249 wangwu
(integer) 0

              注意:有些redis版本,只能一次添加一個member


2)select

a)zrange

語法:zrange key start stop [withscores]

解釋:返回有續集key中指定範圍【通過索引 start stop】的member[及其score];

redis 127.0.0.1:6379> zrange score 0 -1  #所有元素
1) "liuli"
2) "zhangsan"
3) "lisi"
4) "wangwu"
redis 127.0.0.1:6379> zrange score 0 -1 withscores  #所有member及score
1) "liuli"
2) "100"
3) "zhangsan"
4) "230"
5) "lisi"
6) "240"
7) "wangwu"
8) "249"
redis 127.0.0.1:6379> zrange score 0 2 withscores  #前三個元素
1) "liuli"
2) "100"
3) "zhangsan"
4) "230"
5) "lisi"
6) "240"
redis 127.0.0.1:6379> zrange score 0 -2  #第一個元素到
1) "liuli"
2) "zhangsan"
3) "lisi"

注意:0,表示第一個元素,-1 表示最後一個元素,-2 表示倒數第二個元素

b)zcount

         語法:zcount key min max

解釋:統計key中score值介於min 和max之間的member個數

redis 127.0.0.1:6379> zrange score 0 -1 withscores
1) "liuli"
2) "100"
3) "zhangsan"
4) "230"
5) "lisi"
6) "240"
7) "wangwu"
8) "249"
redis 127.0.0.1:6379> zcount score 230 240  # count(score >=230 && score <=240)
(integer) 2
c) zscore

語法:zscore key member

解釋:返回有續集key中member的score

redis 127.0.0.1:6379> zscore score liuli
"100"

d)zrevrange

語法:zrevrange key start stop [withscores]

解釋:返回有續集key中指定範圍[通過索引start stop]的member[及score],返回member根據score按降序排列

redis 127.0.0.1:6379> zrevrange score 0 -1 withscores
1) "wangwu"
2) "249"
3) "lisi"
4) "240"
5) "zhangsan"
6) "230"
7) "liuli"
8) "100"
redis 127.0.0.1:6379> zrevrange score 1 -2
1) "lisi"
2) "zhangsan"

注意:索引0 表示第一個元素,-1 最後一個元素,-2 倒數第二個元素;依次類推

e)zrangebyscore

語法:zrangebyscore key min max [withscores] [limit offset count]

解釋:返回有續集key中,score大於等於min並且小於等於max的member。返回結果按照score遞增的次序排列。可選withscores決定返回結果集中僅僅返回member還是返回member和score;可選參數limit 指定返回結果的數量區間。

redis 127.0.0.1:6379> zrangebyscore score 100 10000 withscores
1) "liuli"
2) "100"
3) "zhangsan"
4) "230"
5) "lisi"
6) "240"
7) "wangwu"
8) "249"
redis 127.0.0.1:6379> zrangebyscore score 100 10000  limit 1 3
1) "zhangsan"
2) "lisi"
3) "wangwu"

f)zrevrangebyscore

語法:zrevrangescore key max min [withscores] [limit offset count]

解釋:返回有續集key中score<=max並且score>=min 的元素,返回結果根據score從大到小順序排列。可選參數withscores決定結果集中是否包含score,可選參數limit 指定返回結果集範圍。

redis 127.0.0.1:6379> zrevrangebyscore score 0 10000
(empty list or set)
redis 127.0.0.1:6379> zrevrangebyscore score 10000 0
1) "wangwu"
2) "lisi"
3) "zhangsan"
4) "liuli"
redis 127.0.0.1:6379> zrevrangebyscore score 10000 0 withscores limit 0, 2
1) "wangwu"
2) "249"
3) "lisi"
4) "240"

注意:max在min之前

g)zrank

語法:zrank key member

解釋:根據score從低到高,返回member在有續集中的index

redis 127.0.0.1:6379> zrange score 0 -1
1) "liuli"
2) "zhangsan"
3) "lisi"
4) "wangwu"
redis 127.0.0.1:6379> zrank score liuli
(integer) 0
redis 127.0.0.1:6379> zrank score wangwu
(integer) 3

h)zrevrank

語法:zrevrank key member

解釋:根據score從高到低排序,返回member在有序集key中的index

redis 127.0.0.1:6379> zrange score 0 -1
1) "liuli"
2) "zhangsan"
3) "lisi"
4) "wangwu"
redis 127.0.0.1:6379> zrevrank score liuli
(integer) 3
redis 127.0.0.1:6379> zrevrank score wangwu
(integer) 0
i)zcard

語法:zcard key

解釋:返回有續集key的基數

redis 127.0.0.1:6379> zcard score
(integer) 4
redis 127.0.0.1:6379> zcard stdu  #有續集不存在返回0
(integer) 0

3)update

a)zincrby

語法:zincrby key increment member

解釋:有續集key的member增加增量increment,返回增加後的score

redis 127.0.0.1:6379> zscore score liuli
"100"
redis 127.0.0.1:6379> zincrby score 300 liuli
"400"
redis 127.0.0.1:6379> zscore score liuli
"400"
redis 127.0.0.1:6379> zincrby score 500 xie
"500"

注意:如果member在key中不存在,則新增個member

4)delete

a)zrem

語法:zrem key member [member ...]

解釋:移除有續集中的一個或多個member,返回移除member的個數

redis 127.0.0.1:6379> zrange score 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
4) "liuli"
5) "xie"
redis 127.0.0.1:6379> zrem score xie wwww  #www不存在
(integer) 1
redis 127.0.0.1:6379> zrange score 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
4) "liuli"

注意:如果member不存在,則忽略

b)zremrangebyrank

語法:zremrangebyrank key start stop

解釋:移除有續集中指定排名範圍【start stop】的元素,返回移除元素個數

redis 127.0.0.1:6379> zrange score 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
4) "liuli"
redis 127.0.0.1:6379> zremrangebyrank score 0 1
(integer) 2
redis 127.0.0.1:6379> zrange score 0 -1
1) "wangwu"
2) "liuli"

注意:如果stop在start之前,則移除0個

c)zremrangebyscore

語法:zremrangebyscore key min max

解釋:移除有續集中的member,移除member的score大於等於min小於等於max;返回移除元素個數

redis 127.0.0.1:6379> zrange score 0 -1 withscores
1) "wangwu"
2) "249"
3) "liuli"
4) "400"
redis 127.0.0.1:6379> zremrangebyscore score 248 250
(integer) 1
redis 127.0.0.1:6379> zrange score 0 -1 withscores
1) "liuli"
2) "400"

5)其他

a)zinterstore

語法:zinterstore destination numkeys  key[key...] [weights weight] [aggregate sum|min|max]

解釋:統計多個有續集的交集,其中有續集key的個數必須以numkeys參數指定,並將統計結果存儲到destination。默認情況下,destination中元素的score是各個有續集key中元素的score之和。使用weights爲每個有續集指定個乘法因子,每個有續集的score在傳遞給集合函數(aggregate)之前,先乘以乘法因子。如果沒指定乘法因子weight,默認是1;使用aggregate選項指定交集的聚合方式。min,最小score,max,最大score,sum,求和。

redis 127.0.0.1:6379> zrange score 0 -1 withscores
1) "lisi"
2) "20"
3) "liuli"
4) "400"
redis 127.0.0.1:6379> zrange score1 0 -1 withscores
1) "wangwu"
2) "20"
3) "liuli"
4) "30"
redis 127.0.0.1:6379> zinterstore dest 2 score score1 #交集求和 sum(score.member.score * 1 + score1.member.score * 1)
(integer) 1
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "liuli"
2) "430"
redis 127.0.0.1:6379> zinterstore dest 2 score score1 weights 1 2 #交集求和,sum(score.member.score * 1 + score1.member.score * 2)
(integer) 1
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "liuli"
2) "460"
redis 127.0.0.1:6379> zinterstore dest 2 score score1 aggregate min #交集求最小值,min(score.member.score * 1 , score1.member.score * 1)
(integer) 1
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "liuli"
2) "30"
redis 127.0.0.1:6379> zinterstore dest 2 score score1 aggregate max #交集求最大值 max(score.member.score * 1 , score1.member.score * 1)
(integer) 1
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "liuli"
2) "400"
redis 127.0.0.1:6379> zinterstore dest 2 score score1 aggregate sum  #交集求和,sum(score.member.score * 1 , score1.member.score * 1)
(integer) 1
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "liuli"
2) "430"
redis 127.0.0.1:6379> zinterstore dest 2 score score1 weights 1 2 aggregate min #交集求最小值 min(score.member.score * 1 , score1.member.score * 2)
(integer) 1
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "liuli"
2) "60"

b)zunionstore

語法:zunionstore destination numkeys  key[key...] [weights weight] [aggregate sum|min|max]

解釋:統計多個有續集的並集,其中有續集key的個數必須以numkeys參數指定,並將統計結果存儲到destination。。默認情況下,destination中元素的score是各個有續集key中元素的score之和。weights指定乘法因子,aggregate指定聚合方式,詳情,請參閱 zinterstore 中介紹

redis 127.0.0.1:6379> zrange score 0 -1 withscores
1) "lisi"
2) "20"
3) "liuli"
4) "400"
redis 127.0.0.1:6379> zrange score1 0 -1 withscores
1) "wangwu"
2) "20"
3) "liuli"
4) "30"
redis 127.0.0.1:6379> zunionstore dest 2 score score1 #交集求和 sum(score.member.score * 1 , score1.member.score * 1)
(integer) 3
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "lisi"
2) "20"
3) "wangwu"
4) "20"
5) "liuli"
6) "430"
redis 127.0.0.1:6379> zunionstore dest 2 score score1  weights 1 2 aggregate sum #交集求和 sum(score.member.score * 1 , score1.member.score * 2)
(integer) 3
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "lisi"
2) "20"
3) "wangwu"
4) "40"
5) "liuli"
6) "460"
redis 127.0.0.1:6379> zunionstore dest 2 score score1  weights 1 2 aggregate max #交集最大值 max(score.member.score * 1 , score1.member.score * 2)
(integer) 3
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "lisi"
2) "20"
3) "wangwu"
4) "40"
5) "liuli"
6) "400"
redis 127.0.0.1:6379> zunionstore dest 2 score score1  weights 2 4 aggregate min #交集最小值 min(score.member.score * 2 , score1.member.score * 4)
(integer) 3
redis 127.0.0.1:6379> zrange dest 0 -1 withscores
1) "lisi"
2) "40"
3) "wangwu"
4) "80"
5) "liuli"
6) "120"

提醒:sorted set的所有函數,請用下面方式查看

[root@xsf001 ~]# redis-cli 
redis 127.0.0.1:6379> help @sorted_set

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章