注意:
-
Sorted Set这种类型是做了排序的,那么就会涉及到一个问题,首先我们要知道集合的元素不一定都是数字,所以排序的标准是什么呢?比如有苹果、橙子、香蕉组成了这个有序集合,那怎么排的序呢?我们可以根据他们的大小或者甘甜的程度来排序,当然也有其他的标准,我们把苹果的甜度设为100,香蕉的甜度设为90,橙子的甜度设为80,然后根据甜度大小排序,这就完成了该集合的排序。
-
关于这个数据类型,我们得知道这种类型要把握好3个基本点,集合的元素、元素的分值、索引
常见命令
Sorted Set和List、Set的区别
- List
- 可以重复:list元素是可以重复的
- 无序:集合里面的元素是无序的
- 有序:是元素的插入和弹出有序
- Set
- 去重:set集合去重了的,元素不会有重复的
- 无序:集合里面的元素是无序的
- 无序:元素插入和弹出是无序的
- Sorted Set:在Set的基础上,多了对成员排序的功能
- 去重:Sorted Set集合去重了的,元素不会有重复的
- 有序:集合里面的元素是有序的
- 无序:元素插入和弹出是无序的
命令演示
127.0.0.1:7000> zadd k1 90 banana 100 apple 80 orange #新增成员
(integer) 3
127.0.0.1:7000> zrange k1 0 -1 #显示全部成员
1) "orange"
2) "banana"
3) "apple"
127.0.0.1:7000> zrange k1 0 -1 withscores #显示全部成员及分数
1) "orange"
2) "80"
3) "banana"
4) "90"
5) "apple"
6) "100"
127.0.0.1:7000> zadd k1 60 banana #对已有的成员更改分数
(integer) 0
127.0.0.1:7000> zrange k1 0 -1 withscores #banana成员分数更新,排序也更新了
1) "banana"
2) "60"
3) "orange"
4) "80"
5) "apple"
6) "100"
127.0.0.1:7000> ZCARD k1 #显示K1集合成员的个数
(integer) 3
127.0.0.1:7000> ZCOUNT k1 80 95 # 显示分数在80到95之间的成员个数
(integer) 1
127.0.0.1:7000> ZSCORE k1 banana #显示banana成员的分数
"60"
127.0.0.1:7000> ZSCORE k1 apple
"100"
127.0.0.1:7000> ZSCORE k1 tomatoes #显示tomatoes的分数,但是集合没有这个成员,所以返回为空
(nil)
127.0.0.1:7000> ZSCORE k2 apple #显示apple的分数,但是没有k2这个集合,所以返回也为空
(nil)
127.0.0.1:7000> ZINCRBY k1 10 banana #给banana的分数加10,原来它为60,返回更新后的分数值
"70"
127.0.0.1:7000> ZSCORE k1 banana
"70"
127.0.0.1:7000> ZINCRBY k1 -20 apple #给apple的分数减去20,原来它为100,返回更新后的分数值
"80"
127.0.0.1:7000> ZSCORE k1 apple
"80"
127.0.0.1:7000> ZRANGE k1 0 -1 withscores #正序显示成员及分数
1) "banana"
2) "70"
3) "apple"
4) "80"
5) "orange"
6) "80"
127.0.0.1:7000> ZREVRANGE k1 0 -1 #逆序显示成员
1) "orange"
2) "apple"
3) "banana"
127.0.0.1:7000> ZREVRANGE k1 0 -1 withscores #逆序显示成员及分数
1) "orange"
2) "80"
3) "apple"
4) "80"
5) "banana"
6) "70"
127.0.0.1:7000>
------------------------------------------------------------------------------------------------------------
127.0.0.1:7000> ZADD k2 10 html 20 css 50 js 60 python 70 groovy 80 java 90 C++ 100 C
127.0.0.1:7000> ZRANGE k2 0 -1 withscores
1) "html"
2) "10"
3) "css"
4) "20"
5) "js"
6) "50"
7) "python"
8) "60"
9) "groovy"
10) "70"
11) "java"
12) "80"
13) "C++"
14) "90"
15) "C"
16) "100"
127.0.0.1:7000> ZRANGEBYSCORE k2 60 100 withscores #以分数来显示成员排序且带分数
1) "python"
2) "60"
3) "groovy"
4) "70"
5) "java"
6) "80"
7) "C++"
8) "90"
9) "C"
10) "100"
127.0.0.1:7000> ZRANGEBYSCORE k2 -inf +inf withscores #显示最小值到最大值之间的成员及分数
1) "html"
2) "10"
3) "css"
4) "20"
5) "js"
6) "50"
7) "python"
8) "60"
9) "groovy"
10) "70"
11) "java"
12) "80"
13) "C++"
14) "90"
15) "C"
16) "100"
127.0.0.1:7000> ZREVRANGEBYSCORE k2 -inf +inf withscores #逆序显示,最小值在尾部,所以返回为空
(empty array)
127.0.0.1:7000> ZREVRANGEBYSCORE k2 +inf -inf withscores #逆序显示,最大值在头部,最小值在尾部,由大到小排序
1) "C"
2) "100"
3) "C++"
4) "90"
5) "java"
6) "80"
7) "groovy"
8) "70"
9) "python"
10) "60"
11) "js"
12) "50"
13) "css"
14) "20"
15) "html"
16) "10"
127.0.0.1:7000> ZREVRANGEBYSCORE k2 90 45 withscores #逆序显示,90到45之间的成员及其分数
1) "C++"
2) "90"
3) "java"
4) "80"
5) "groovy"
6) "70"
7) "python"
8) "60"
9) "js"
10) "50"
127.0.0.1:7000> ZREVRANGEBYSCORE k2 90.6 45.9 withscores #分数是float类型
1) "C++"
2) "90"
3) "java"
4) "80"
5) "groovy"
6) "70"
7) "python"
8) "60"
9) "js"
10) "50"
127.0.0.1:7000> ZRANGEBYSCORE k2 30 90 withscores limit 0 2 #正序返回分数值从30开始计数到90之间的2个成员
1) "js"
2) "50"
3) "python"
4) "60"
127.0.0.1:7000> ZREVRANGEBYSCORE k2 100 50 withscores limit 0 2 #逆序返回分数值从100开始计数到50之间的2个成员
1) "C"
2) "100"
3) "C++"
4) "90"
127.0.0.1:7000>
127.0.0.1:7000> ZRANK k2 java #返回java成员的正序号
(integer) 5
127.0.0.1:7000> ZREVRANK k2 java #返回java成员的逆序号
(integer) 2
127.0.0.1:7000>
集合:
k2: 10 html 20 css 50 js 60 python 70 groovy 80 java 90 C++ 100 C
k3: 80 python 75 java 90 C++ 90 C# 100 C
交集
127.0.0.1:7000> ZADD k3 75 java 80 python 100 C 90 C++ 90 C#
(integer) 5
127.0.0.1:7000> ZRANGE k3 0 -1 withscores
1) "java"
2) "75"
3) "python"
4) "80"
5) "C#"
6) "90"
7) "C++"
8) "90"
9) "C"
10) "100"
127.0.0.1:7000> ZRANGE k2 0 -1 withscores
1) "html"
2) "10"
3) "css"
4) "20"
5) "js"
6) "50"
7) "python"
8) "60"
9) "groovy"
10) "70"
11) "java"
12) "80"
13) "C++"
14) "90"
15) "C"
16) "100"
127.0.0.1:7000> ZINTERSTORE destk1 2 k2 k3 #默认求和,并存储在destk1集合中
(integer) 4
127.0.0.1:7000> ZRANGE destk1 0 -1 withscores
1) "python"
2) "140"
3) "java"
4) "155"
5) "C++"
6) "180"
7) "C"
8) "200"
127.0.0.1:7000> ZINTERSTORE destk1 2 k2 k3 weights 0.5 0.5 #带权重求和,就是说每个集合都乘以权重因子再相加
(integer) 4
127.0.0.1:7000> ZRANGE destk1 0 -1 withscores
1) "python"
2) "70"
3) "java"
4) "77.5"
5) "C++"
6) "90"
7) "C"
8) "100"
127.0.0.1:7000> ZINTERSTORE destk1 2 k2 k3 weights 0.5 0.5 AGGREGATE min #权重再求最小,就是说每个集合都乘以权重因子再求出交集中的最小值
(integer) 4
127.0.0.1:7000> ZRANGE destk1 0 -1 withscores
1) "python"
2) "30"
3) "java"
4) "37.5"
5) "C++"
6) "45"
7) "C"
8) "50"
并集
127.0.0.1:7000> ZUNIONSTORE destk2 2 k2 k3 #求并集
(integer) 9
127.0.0.1:7000> ZRANGE destk2 0 -1 withscores
1) "html"
2) "10"
3) "css"
4) "20"
5) "js"
6) "50"
7) "groovy"
8) "70"
9) "C#"
10) "90"
11) "python"
12) "140"
13) "java"
14) "155"
15) "C++"
16) "180"
17) "C"
18) "200"
127.0.0.1:7000> ZUNIONSTORE destk2 2 k2 k3 weights 0.5 0.5 aggregate max #求带权重的并集,并取出并集中的较大者
(integer) 9
127.0.0.1:7000> ZRANGE destk2 0 -1 withscores #查看结果
1) "html"
2) "5"
3) "css"
4) "10"
5) "js"
6) "25"
7) "groovy"
8) "35"
9) "java"
10) "40"
11) "python"
12) "40"
13) "C#"
14) "45"
15) "C++"
16) "45"
17) "C"
18) "50"
127.0.0.1:7000>