[toc]
有序集合可以模擬優先級隊列與延時隊列,排行榜等功能的實現
## 增
zadd key score1 value1 score2 value2 ..
```
redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lilei 21 lilei
(integer) 3
```
添加元素
在redis的3.02版本還可以為zadd增加一些附加參數 ZADD key [NX|XX] [CH] [INCR] score member
NX: 不存在的情況下
XX: 存在的情況下(更新)
CH: ??
INCR: 使用該參數使得ZADD的功能類似ZINCRBY的功能
## 刪
zremrangebyscore key min max
```
redis 127.0.0.1:6379> zremrangebyscore stu 4 10
(integer) 2
redis 127.0.0.1:6379> zrange stu 0 -1
1) "f"
```
作用: 按照socre來刪除元素,刪除score在[min,max] (包括)之間的
zrem key value1 value2 ..
作用: 刪除集合中的元素
zremrangebyrank key start end
```
redis 127.0.0.1:6379> zremrangebyrank stu 0 1
(integer) 2
redis 127.0.0.1:6379> zrange stu 0 -1
1) "c"
2) "e"
3) "f"
4) "g"
```
作用: 按排名刪除元素,刪除名次在[start,end] (包括)之間的
## 改
ZINCRBY key increment member
```
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"
redis>
```
為有序集key的成員member的score值加上增量increment。如果key中不存在member,就在key中添加一個member,score是increment(就好像它之前的score是0.0)。如果key不存在,就創建一個只含有指定member成員的有序集合。
## 查
zrange key start stop [withscores]
```
127.0.0.1:6379> zrange yx1 0 3
127.0.0.1:6379> zrange yx1 0 -1 withscores #取出所有以及它的分數
```
把集合排序后,返回名次[start,stop]的元素
默認是升續排列,降序可以用zrevrange
withscores 是把score也打印出來
zrangebyscore key min max [withscores] limit offset N
zrevrangebyscore key max min [withscores] limit offset N
```
redis 127.0.0.1:6379> zadd stu 1 a 3 b 4 c 9 e 12 f 15 g
(integer) 6
redis 127.0.0.1:6379> zrangebyscore stu 3 12 limit 1 2 withscores #取3到12,并從1位開始取2位,連同分數一起取出來
1) "c"
2) "4"
3) "e"
4) "9"
127.0.0.1:6379> ZREVRANGEBYSCORE stu 12 3 withscores
1) "f"
2) "12"
3) "e"
4) "9"
5) "c"
6) "4"
7) "b"
8) "3"
```
作用: 集合(升續|降序)排序后,取score在[min,max]內的元素,并跳過offset個, 取出N個
注意:zrange是按名次來取,zrangebyscore是按score的值來取;
zcard key
返回集合元素個數
zrank key member
查詢member的排名(升序0名開始)
zrevrank key memeber
查詢 member的排名(降序0名開始)
zcount key min max
返回[min,max] 區間內元素的數量
zrevrange key start stop [withscores]
作用:把集合降序排列,取名次[start,stop]之間的元素
zinterstore destination numkeys key1 [key2 ...] [weights weight [weight ...]] [aggregate sum|min|max]
destination: 運算結果存放的集合名稱
numkeys: 參與運算的集合個數
key1,key2...: 參與運算的集合名稱
weights: 權重
aggregate: 聚合的方式sum|min|max 默認是sum;
```
redis 127.0.0.1:6379> zadd z1 2 a 3 b 4 c
(integer) 3
redis 127.0.0.1:6379> zadd z2 2.5 a 1 b 8 d
(integer) 3
# 取z1和z2的交集
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1
1) "b"
2) "a"
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "4"
3) "a"
4) "4.5"
# Aggregate sum->score相加,min->最小score的集合, max->最大score集合;
# 可以通過weigth設置不同key的權重, 交集時,socre * weights
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate sum #默認是這個
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "4"
3) "a"
4) "4.5"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate min #兩個集合中的交集最小從新生成集合到tmp里面
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "1"
3) "a"
4) "2"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 weights 1 2 #權重默認為1,當前的score的真正值就是score*weight 權重,比如z2里面的b未聲明權重2前就是3,聲明權重2就是6;聲明權重后的運算都是按照權重后的值來運算
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "5"
3) "a"
4) "7"
```
更多請參考: http://www.redis.cn/commands.html#sorted_set