有序集合Sorted Set
在集合类型的基础上每个有序集合类型为集合中的每个元素都关联一个分数,使得集合除了插入、删除、判断是否存在等操作,还支持获得分数最高或最低的前N个元素,虽然集合中每个元素都是不同的,但分数可以相同
有序集合和列表的相似处:
- 二者都是有序的
- 二者都可以获取某一范围内的元素
有序集合和列表的不同点:
- 列表是通过链表实现的,获取靠近两端的数据极快,而当元素增多后,访问中间数据的速度会变慢
- 有序集合类型是使用散列表和跳跃表实现的,所以读取位于中间的数据也很快
- 列表不能简单地调整某个元素的位置,但是有序元素可以
- 有序集合要比列表更消耗内存
zadd可以向一个有序集合添加一个元素和该元素的分数,如果该元素已存在则会用新的分数替换原有的分数
zscore可以获取元素的分数
127.0.0.1:6379> hincrby person score 60
(integer) 60
127.0.0.1:6379> zadd scoreboard 89 Tom 67 Peter 100 David
(integer) 3
127.0.0.1:6379> zadd scoreboard 76 Peter
(integer) 0
127.0.0.1:6379> zscore scoreboard Peter
"76"
分数不单单可以是整数,还可以是浮点数,+inf和-inf代表正无穷和负无穷
127.0.0.1:6379> zadd testboard 17E+307 a
(integer) 1
127.0.0.1:6379> zadd testboard 1.5 b
(integer) 1
127.0.0.1:6379> zadd testboard +inf c
(integer) 1
127.0.0.1:6379> zadd testboard -inf d
(integer) 1
zrange key start stop [withscores]
zrange会按照元素分数从小到大的顺序返回从start到stop之间的所有元素。zrange和lrange类似,索引都是从0开始,负数代表从后向前查找,-1表示最后一个元素,如果加上withscores会同时返回分数
127.0.0.1:6379> zrange scoreboard 0 2
1) "Peter"
2) "Tom"
3) "David"
127.0.0.1:6379> zrange scoreboard 1 -1
1) "Tom"
2) "David"
127.0.0.1:6379> zrange scoreboard 1 -1 withscores
1) "Tom"
2) "89"
3) "David"
4) "100"
zrangebyscore key min max [withscores] [limit offset count]
zrangebyscore 命令按照元素分数从小到大的顺序返回分数在min到max之间,如果不希望包含端点值,可以在分数前加上(
127.0.0.1:6379> zrangebyscore scoreboard 80 100
1) "Tom"
2) "David"
127.0.0.1:6379> zrangebyscore scoreboard 80 (100
1) "Tom"
127.0.0.1:6379> zrangebyscore scoreboard (80 +inf withscores
1) "Tom"
2) "89"
3) "David"
4) "100"
获取分数高于60分,从第二人开始的3个人
127.0.0.1:6379> zadd scoreboard 56 Jerry 92 Wendy 67 Yvonne
(integer) 3
127.0.0.1:6379> zrange scoreboard 0 -1 withscores
1) "Jerry"
2) "56"
3) "Yvonne"
4) "67"
5) "Peter"
6) "76"
7) "Tom"
8) "89"
9) "Wendy"
10) "92"
11) "David"
12) "100"
127.0.0.1:6379> zrangebyscore scoreboard 60 +inf limit 1 3
1) "Peter"
2) "Tom"
3) "Wendy"
zrevrangebyscore命令可以按照分数降序返回结果
127.0.0.1:6379> zrevrangebyscore scoreboard 100 0 limit 0 3
1) "David"
2) "Wendy"
3) "Tom"
zincrby命令可以增加一个元素的分数,返回值为修改后的分数,增加的值可以为负数
127.0.0.1:6379> zscore scoreboard Jerry
"56"
127.0.0.1:6379> zincrby scoreboard 10 Jerry
"66"
127.0.0.1:6379> zincrby scoreboard -5 Jerry
"61"
zcount key min max
获得指定分数范围内的元素个数
127.0.0.1:6379> zcount scoreboard 90 100
(integer) 2
127.0.0.1:6379> zcount scoreboard (89 +inf
(integer) 2
zrem key member [member……]删除一个或 多个
127.0.0.1:6379> zrem scoreboard Jerry
(integer) 1
zremrangebyrank key start top 按照分数从小到大的顺序,删除处在指定排名范围的所有元素
127.0.0.1:6379> zadd testRem 1 a 2 b 3 c 4 d 5 e 6 f
(integer) 6
127.0.0.1:6379> zrange testRem 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> zremrangebyrank testRem 0 2
(integer) 3
127.0.0.1:6379> zrange testRem 0 -1
1) "d"
2) "e"
3) "f"
zremrangebyscore key min max
127.0.0.1:6379> zadd testRem 1 a 2 b 3 c 4 d 5 e 6 f
(integer) 3
127.0.0.1:6379> zrange testRem 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> zremrangebyscore testRem (4 5
(integer) 1
127.0.0.1:6379> zrange testRem 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "f"
获取元素的排名
zrank key member 按照元素分数从小到大的顺序获取指定元素的排名
zrevrank key member 与zrank相反,分数最大的排名为0
127.0.0.1:6379> zrange scoreboard 0 -1
1) "Yvonne"
2) "Peter"
3) "Tom"
4) "Wendy"
5) "David"
127.0.0.1:6379> zrank scoreboard Peter
(integer) 1
127.0.0.1:6379> zrevrank scoreboard Peter
(integer) 3
zinterstore destination numkeys key [key……] [weights weight [weight……]] [aggregate sum|min|max]
zinterstore 命令用来计算多个有序集合的交集并将其结果存储在destination 键中(同样以有序集合类型存储),返回值为destination 键中的元素个数
当aggregate 是sum(也是默认值),destination 键中元素的分数是每个参与计算的集合中该元素分数的和
127.0.0.1:6379> zadd sortedSets 1 a 2 b
(integer) 2
127.0.0.1:6379> zadd sortedSets1 1 a 2 b
(integer) 2
127.0.0.1:6379> zadd sortedSets2 10 a 20 b
(integer) 2
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "11"
3) "b"
4) "22"
当aggregate 是min时,destination 键中元素的分数是每个参与计算的集合中该元素分数的最小值
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2 aggregate min
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
当aggregate 是max时,destination 键中元素的分数是每个参与计算的集合中该元素分数的最大值
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2 aggregate max
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
weights参数设置每个集合的权重,每个集合在参与计算时元素的分数都会被乘上该集合的权重
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2 weights 0.1 1
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "10.1"
3) "b"
4) "20.199999999999999"