Redis重制(八)zset类型

9 阅读5分钟

这里我们来学习redis的第五个数据类型:Zset(有序集合)

 

Zset一般用于存储带有分数的字符串元素,按照分数排序,如排行榜、范围统计等。

 

下面我们来了解一下zset集合的基本命令:

 

1:zadd添加元素

127.0.0.1:6379> zadd aset1 100 zhangsan 200 lisi 300 wangwu 400 sige 500 laowu
(integer) 5
127.0.0.1:6379> zrange aset1 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
4) "sige"
5) "laowu"

 

2:ZRANGEBYSCORE排序(从小到大)也是通过分数筛选元素

-inf:负无穷

+inf:正无穷

127.0.0.1:6379> zrangebyscore aset1 100 500                # 指定区间 从小到大排序
1) "zhangsan"
2) "lisi"
3) "wangwu"
4) "sige"
5) "laowu"
127.0.0.1:6379> zrangebyscore aset1 -inf +inf withscores            # 显示分数
 1) "zhangsan"
 2) "100"
 3) "lisi"
 4) "200"
 5) "wangwu"
 6) "300"
 7) "sige"
 8) "400"
 9) "laowu"
10) "500"

 

3:zrem移除用户

127.0.0.1:6379> zrem aset1 laowu
(integer) 1
127.0.0.1:6379> zrange aset1 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
4) "sige"

 

4:zcard获取zset集合中的个数

127.0.0.1:6379> zrange aset1 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
4) "sige"
127.0.0.1:6379> zcard aset1
(integer) 4

 

5:zrevrange排序 返回有序集中指定区间内的成员,通过索引,分数从高到低(从大到小)

这个命令使用的是索引index  命令中未指定score则都使用索引

127.0.0.1:6379> zrevrange aset1 0 10
1) "sige"
2) "wangwu"
3) "lisi"
4) "zhangsan"

 

6:zcount获取指定区间的成员数量,这个命令的区间是score

127.0.0.1:6379> zcount aset1 -inf +inf
(integer) 4
127.0.0.1:6379> zcount aset1 0 1000
(integer) 4

 

7:ZINCRBY指定成员的分数加上指定增量

127.0.0.1:6379> zincrby aset1 500 zhangsan                  # 张三 score + 500
"600"
127.0.0.1:6379> zrange aset1 0 -1 withscores                # 成功,排序在最后了,自动排序
 1) "500"
 2) "11"
 3) "lisi"
 4) "200"
 5) "wangwu"
 6) "300"
 7) "sige"
 8) "400"
 9) "1"
10) "500"
11) "zhangsan"
12) "600"

 

8:zrange 获取set所有成员

127.0.0.1:6379> zrange aset1 0 -1 withscores  # 成功,排序在最后了,自动排序
 1) "500"
 2) "11"
 3) "lisi"
 4) "200"
 5) "wangwu"
 6) "300"
 7) "sige"
 8) "400"
 9) "1"
10) "500"
11) "zhangsan"
12) "600"

 

9:ZLEXCOUNT  在有序集合中计算指定字典区间内成员数量

127.0.0.1:6379> zlexcount aset1 - +
(integer) 6
127.0.0.1:6379> zrange aset1 0 -1
1) "500"
2) "lisi"
3) "wangwu"
4) "sige"
5) "1"
6) "zhangsan"
127.0.0.1:6379>

这个命令是个玄学

 

10:Zrevrank返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序。

127.0.0.1:6379> zrange aset1 0 -1
1) "500"
2) "lisi"
3) "wangwu"
4) "sige"
5) "1"
6) "zhangsan"
127.0.0.1:6379> zrevrank aset1 wangwu
(integer) 3
127.0.0.1:6379> zrevrank aset1 zhangsan
(integer) 0
127.0.0.1:6379> zrevrank aset1 lisi
(integer) 4

根据返回值我们可以发现,排名是根据分数来排序的,分数越大,排名越靠下,返回值就越小,也就是0 排第一。


11:Zscore返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil 。

127.0.0.1:6379> zscore aset1 wangwu
"300"

 

12:Zunionstore计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。

默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和 。

这个命令还是有点意思的,有意思的是她的参数weights,加上这个参数之后,就有意思了。

举个例子,两个zset集合aset1和aset2,存储了两个部门的人员和对应的工资情况,现在aset1部门的人不涨工资,aset2部门的人  涨一倍(*2),将两个部门的人合并统计一下当月工资的情况:

127.0.0.1:6379> zrange aset1 0 -1 withscores         # 查看set1数据
 1) "500"
 2) "11"
 3) "lisi"
 4) "200"
 5) "wangwu"
 6) "300"
 7) "sige"
 8) "400"
 9) "1"
10) "500"
11) "zhangsan"
12) "600"
127.0.0.1:6379> zrange aset2 0 -1 withscores         # 查看set2数据
 1) "qwe"
 2) "10"
 3) "asd"
 4) "20"
 5) "zxc"
 6) "30"
 7) "qaz"
 8) "40"
 9) "wsx"
10) "50"
127.0.0.1:6379> zunionstore unionset 2 aset1 aset2 weights 1 2 #两个集合带权重合并一下
(integer) 11
127.0.0.1:6379> zrange unionset 0 -1 withscores    # 查看一下合并之后的集合,发现set2得score确实 * 2了
 1) "500"
 2) "11"
 3) "qwe"
 4) "20"
 5) "asd"
 6) "40"
 7) "zxc"
 8) "60"
 9) "qaz"
10) "80"
11) "wsx"
12) "100"
13) "lisi"
14) "200"
15) "wangwu"
16) "300"
17) "sige"
18) "400"
19) "1"
20) "500"
21) "zhangsan"
22) "600"

 

这个时候有的同学可能就会问了,如果两个集合中存在相同的值,会如何处理呢?

别急,这个问题将由下边这个命令来演示

 

13:ZINTERSTORE   将指定两个集合的交集取出并存储到一个zset集合中

127.0.0.1:6379> zrange set3 0 -1 withscores          # set3 所有元素
1) "qwe"
2) "10"
3) "asd"
4) "20"
127.0.0.1:6379> zrange aset2 0 -1 withscores         # asset2 所有元素
 1) "qwe"
 2) "10"
 3) "asd"
 4) "20"
 5) "zxc"
 6) "30"
 7) "qaz"
 8) "40"
 9) "wsx"
10) "50"
127.0.0.1:6379> zinterstore interset1 2 aset2 set3 weights 1 2      # 合并一下
(integer) 2
127.0.0.1:6379> zrange interset1 0 -1 withscores           # interest1集合所有元素
1) "qwe"
2) "30"
3) "asd"
4) "60"

 

算法很简单 set3(asd 10 * 1) + aset2 (asd 10 * 2) = 30

 

以上大概就是zset的基本使用。

 

有好的建议,请在下方输入你的评论。