您的位置:首页 > 数据库 > Redis

redis学习 第三章 5种数据类型----sorted set类型

2016-10-17 17:53 357 查看
跟着Redis入门指南学习

第三章 5种数据类型----有序集合类型(sorted set)

在集合类型的基础上有序集合类型为集合中每一个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能获得分数最高(最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素都不同,但是他们的分数却可以相同。

有序集合类型使用散列表和跳跃表(skip list)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度为O(log(N)))。列表不可以调整某个元素的位置,但是有序集合可以(通过元素分数的修改)。有序集合比列表更耗内存。

3.6.2 命令

1.增加元素

<span style="font-size:14px;">zadd key score member [score member ...]</span>

<span style="font-size:14px;">127.0.0.1:6379[1]> zadd scoreboard 88 wjq 89 hjj 86 wzx
(integer) 3
127.0.0.1:6379[1]> zadd scoreboard 96 wjq
(integer) 0</span>

返回值是添加的元素个数,如果元素已存在,可以通过这个命令来修改运算值。

2.获取元素的分数

<span style="font-size:14px;">zscore key member</span>
<span style="font-size:14px;">127.0.0.1:6379[1]> zscore scoreboard wjq
"96"</span>

3.获取排名在某个范围的元素

<span style="font-size:14px;">zrange key start stop [withscores]
zrevrange key start stop [withscores]</span>

zrange命令会按照元素分数从小到大的顺序返回索引从start 到stop 之间的所有元素(包含两端的元素)。zrange 命令与lrange命令十分相似,如所索引都是从0开始,负数代表从后向前查找(-1表示最后一个元素)。

<span style="font-size:14px;">127.0.0.1:6379[1]> zadd scoreboard 88 wjq 89 hjj 86 wzx
(integer) 3
127.0.0.1:6379[1]> zadd scoreboard 96 wjq
(integer) 0
127.0.0.1:6379[1]> zscore scoreboard wjq
"96"
127.0.0.1:6379[1]> zrange scoreboard 0 2
1) "wzx"
2) "hjj"
3) "wjq"
127.0.0.1:6379[1]> zrange scoreboard 1 -1
1) "hjj"
2) "wjq"
127.0.0.1:6379[1]> zrange scoreboard 1 -2
1) "hjj"
127.0.0.1:6379[1]> zrange scoreboard 1 -3
(empty list or set)
127.0.0.1:6379[1]> zadd scoreboard 100 wzd 77 wz
(integer) 2
127.0.0.1:6379[1]> zrange scoreboard 0 2
1) "wz"
2) "wzx"
3) "hjj"
127.0.0.1:6379[1]> zrange scoreboard 1 -1
1) "wzx"
2) "hjj"
3) "wjq"
4) "wzd"
127.0.0.1:6379[1]> zrange scoreboard 0 -1
1) "wz"
2) "wzx"
3) "hjj"
4) "wjq"
5) "wzd"
127.0.0.1:6379[1]> zrange scoreboard 0 -1 withscores
1) "wz"
2) "77"
3) "wzx"
4) "86"
5) "hjj"
6) "89"
7) "wjq"
8) "96"
9) "wzd"
10) "100"</span>

zrevrange和zrange命令的不同是按照元素分数从大到小的顺序给出结果的。

<span style="font-size:14px;">127.0.0.1:6379[1]> zrevrange scoreboard 0 -1 withscores
1) "wzd"
2) "100"
3) "wjq"
4) "96"
5) "hjj"
6) "89"
7) "wzx"
8) "86"
9) "wz"
10) "77"</span>

4.获取指定分数范围的元素

<span style="font-size:14px;">zrangebyscore key min max [withscores] [limit offset count]</span>

zrangebyscore命令:按照元素分数从小到大的顺序返回分数在min 和max 之间(包括min 和max)的元素。

<span style="font-size:14px;">127.0.0.1:6379[1]> zrangebyscore scoreboard 80 100  withscores
1) "wzx"
2) "86"
3) "hjj"
4) "89"
5) "wjq"
6) "96"
7) "wzd"
8) "100"
127.0.0.1:6379[1]> zrangebyscore scoreboard 80 (100  withscores
1) "wzx"
2) "86"
3) "hjj"
4) "89"
5) "wjq"
6) "96"</span>

在分数前增加“(”就可以不包括这个分数。还可以用-inf 和+inf分别表示负无穷和正无穷。

<span style="font-size:14px;">127.0.0.1:6379[1]> zrangebyscore scoreboard 80 (100  withscores
1) "wzx"
2) "86"
3) "hjj"
4) "89"
5) "wjq"
6) "96"
127.0.0.1:6379[1]> zrangebyscore scoreboard 90 +inf  withscores
1) "wjq"
2) "96"
3) "wzd"
4) "100"</span>

想要获取分数高于70的从第二个人开始的2个人:

<span style="font-size:14px;">127.0.0.1:6379[1]> zrange scoreboard 0 -1 withscores
1) "wz"
2) "77"
3) "wzx"
4) "86"
5) "hjj"
6) "89"
7) "wjq"
8) "96"
9) "wzd"
10) "100"
127.0.0.1:6379[1]> zrangebyscore scoreboard 70 +inf limit 1 2
1) "wzx"
2) "hjj"</span>

想要获取分数低于100的前3个人

<span style="font-size:14px;">127.0.0.1:6379[1]> zrevrangebyscore scoreboard 100 0 limit 0 3
1) "wzd"
2) "wjq"
3) "hjj"</span>

5.增加某个元素的分数

<span style="font-size:14px;">zincrby key increment member</span>

返回值是更改后的分数

<span style="font-size:14px;">127.0.0.1:6379[1]> zrange scoreboard 0 -1 withscores
1) "wz"
2) "77"
3) "wzx"
4) "86"
5) "hjj"
6) "89"
7) "wjq"
8) "96"
9) "wzd"
10) "100"
127.0.0.1:6379[1]> zincrby scoreboard 10 wzx
"96"
127.0.0.1:6379[1]> zincrby scoreboard -1  wzx
"95"
127.0.0.1:6379[1]> zincrby scoreboard 88 zyx
"88"</span>
3.6.4 命令拾遗

1.获得集合中元素的数量

<span style="font-size:14px;">zcard key</span>
<span style="font-size:14px;">127.0.0.1:6379[1]> zcard scoreboard
(integer) 6
</span>

2.获取指定分数范围内的元素个数


<span style="font-size:14px;">zcount key min max</span>
<span style="font-size:14px;">127.0.0.1:6379[1]> zrange scoreboard 0 -1 withscores
1) "wz"
2) "77"
3) "zyx"
4) "88"
5) "hjj"
6) "89"
7) "wzx"
8) "95"
9) "wjq"
10) "96"
11) "wzd"
12) "100"
127.0.0.1:6379[1]> zcount scoreboard 90 100
(integer) 3
127.0.0.1:6379[1]> zcount scoreboard (89 +inf
(integer) 3</span>

3.删除一个或多个元素

<span style="font-size:14px;">zrem key member [member ...]</span>
<span style="font-size:14px;">127.0.0.1:6379[1]> zrem scoreboard wjq
(integer) 1
127.0.0.1:6379[1]> zcard scoreboard
(integer) 5</span>

4.按照排名顺序范围删除元素

<span style="font-size:14px;">zremrangebyrank key start stop</span>
<span style="font-size:14px;">127.0.0.1:6379[1]> zadd testRem 1 a 2 b 3 c 4 d 5 e 6 f
(integer) 6
127.0.0.1:6379[1]> zremrangebyrank testRem 0 2
(integer) 3
127.0.0.1:6379[1]> zrange testRem 0 -1
1) "d"
2) "e"
3) "f"</span>

5.按照分数范围删除元素


<span style="font-size:14px;">zremrangebyscore key min max</span>
<span style="font-size:14px;">127.0.0.1:6379[1]> zremrangebyscore testRem (4 5
(integer) 1
127.0.0.1:6379[1]> zrange testRem 0 -1 withscores
1) "d"
2) "4"
3) "f"
4) "6"</span>

6.获取元素的排名

<span style="font-size:14px;">zrank key member
zrevrank key member
</span>
<span style="font-size:14px;">127.0.0.1:6379[1]> zrange scoreboard 0 -1 withscores
1) "wz"
2) "77"
3) "zyx"
4) "88"
5) "hjj"
6) "89"
7) "wzx"
8) "95"
9) "wzd"
10) "100"
127.0.0.1:6379[1]> zrank scoreboard hjj
(integer) 2
127.0.0.1:6379[1]> zrevrank scoreboard zyx
(integer) 3</span>

7.计算有序集合的交集

<span style="font-size:14px;">zinterstore destination numbers key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]</span>

zinterstore 命令用来计算多个有序集合的交集并将结果存储在destination健中(同样以有序类型存储),返回值为destination健中元素的个数。

destination健中元素的分数是由aggregate参数决定。

(1)aggregate 默认值是sum

127.0.0.1:6379[1]> zadd sortedSets1 1 a 2 b
(integer) 2
127.0.0.1:6379[1]> zadd sortedSets2 10 a 20 b
(integer) 2
127.0.0.1:6379[1]> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2
(integer) 2
127.0.0.1:6379[1]> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "11"
3) "b"
4) "22"
(2)aggregate 是为min
127.0.0.1:6379[1]> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2 aggregate min
(integer) 2
127.0.0.1:6379[1]> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
(3)aggregate是max
127.0.0.1:6379[1]> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2 aggregate max
(integer) 2
127.0.0.1:6379[1]> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
zinterstore命令还能通过weights参数设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上该集合的权重
127.0.0.1:6379[1]> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2 weights 1 0.1
(integer) 2
127.0.0.1:6379[1]> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "2"
3) "b"
4) "4"
另外还有一个命令和zinterstore命令一样,名为zunionstore,它的作用是计算集合间的并集。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: