前提:还不了解的可以先了解一下ZUNIONSTORE 的使用
以下是3天,文章id为,1000,1001,1002 的浏览量
1 2 3 | zadd article:12:08 1 1000 2 1001 3 1002 zadd article:12:09 1 1000 2 1001 3 1002 zadd article:12:10 1 1000 3 1001 3 1002 |
12月8号
1 2 3 4 5 6 7 8 | 127.0.0.1:6379> zrange article:12:08 0 -1 withscores 1) "1000" 2) "1" 3) "1001" 4) "2" 5) "1002" 6) "3" 127.0.0.1:6379> |
12月9号
1 2 3 4 5 6 7 8 | 127.0.0.1:6379> zrange article:12:09 0 -1 withscores 1) "1000" 2) "1" 3) "1001" 4) "2" 5) "1002" 6) "3" 127.0.0.1:6379> |
12月10号
1 2 3 4 5 6 7 8 | 127.0.0.1:6379> zrange article:12:10 0 -1 withscores 1) "1000" 2) "1" 3) "1001" 4) "3" 5) "1002" 6) "3" 127.0.0.1:6379> |
1. 求出3天文章的总访问量
1 2 3 4 5 6 7 8 9 10 | 127.0.0.1:6379> ZUNIONSTORE all_pv 3 article:12:08 article:12:09 article:12:10 (integer) 3 127.0.0.1:6379> zrange all_pv 0 -1 withscores 1) "1000" 2) "3" 3) "1001" 4) "7" 5) "1002" 6) "9" 127.0.0.1:6379> |
ZUNIONSTORE all_pv 3 article:12:08 article:12:09 article:12:10 这里的3是指key的个数,key后面可跟N个key,ZUNIONSTORE 默认是对所有子集进行求和,然后传入新的子集all_pv,如果all_pv子集已经存在则会覆盖.
2. 需求:第一天的浏览量 X 5倍,第二天X10倍。
1 2 3 4 5 6 7 8 9 10 | 127.0.0.1:6379>ZUNIONSTORE all_pv 3 article:12:08 article:12:09 article:12:10 WEIGHTS 5 10 1 (integer) 3 127.0.0.1:6379> zrange all_pv 0 -1 withscores 1) "1000" 2) "16" 3) "1001" 4) "33" 5) "1002" 6) "48" 127.0.0.1:6379> |
ZUNIONSTORE all_pv 3 article:12:08 article:12:09 article:12:10 WEIGHTS 5 10 1
官方解释:使用 WEIGHTS 选项时,可以为各个有序集合输入指定一个乘法系数(Multiplication factor )。这意味着在将每个有序集合输入中的每个元素的分值传递给聚合函数(Aggregation function)之前,会将该分值乘以对应的系数。当未给定 WEIGHTS 选项时,乘法系数默认为 1。
上面例子 WEIGHTS 5 10 1 ,
第一个参数5,就是将article:12:08这个子集的分数值 乘 5,
第二个参数 10 就是将article:12:09这个子集的分数值 乘 10,
第三个参数 10 就是将article:12:10这个子集的分数值 乘 1,
拿 ID 1000 举例:
在 article:12:08 子集里 1000 = 1 ,由于加了 WEIGHTS 5 ,所以 1000 = 1 * 5
在 article:12:08 子集里 1000 = 1,由于加了 WEIGHTS 10 ,所以 1000 = 1 * 10
在 article:12:08 子集里 1000 = 1,由于加了 WEIGHTS 1 ,所以 1000 = 1 * 1
最后 all_pv 子集里面的 1000 = 5 + 10 + 1 。
是先计算WEIGHTS 选项,然后再求和
3. ** 求这3天 哪个文章的日访问量最多和最少**
1.为了更直观一点,我们对子集重新赋值
1 2 3 | zadd article:12:08 1 1000 2 1001 3 1002 zadd article:12:09 4 1000 5 1001 6 1002 zadd article:12:10 7 1000 8 1001 9 1002 |
1.最多:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 127.0.0.1:6379> ZUNIONSTORE min_data 3 article:12:08 article:12:09 article:12:10 A GGREGATE MAX (integer) 3 127.0.0.1:6379> ZREVRANGE min_data 0 -1 WITHSCORES 1) "1002" 2) "9" 3) "1001" 4) "8" 5) "1000" 6) "7" 127.0.0.1:6379> ZUNIONSTORE min_data 3 article:12:08 article:12:09 article:12:10 AGGREGATE MIN (integer) 3 127.0.0.1:6379> zrange min_data 0 -1 withscores 1) "1000" 2) "1" 3) "1001" 4) "2" 5) "1002" 6) "3" 127.0.0.1:6379> |
这里利用了第三个参数 GGREGATE 这个参数的可选项为: SUM|MIN|MAX,默认SUM。
MIN,求3子集中分数的最小的元素,并写入新的子集 min_data 中
MAX,求3子集中分数的最大的元素,并写入新的子集 max_data 中
这里类似mysql的分组排序
ZREVRANGE :返回有序集中指定区间内的成员,通过索引,分数从高到低。
ZREVRANGE跟之前的 ZRANGE 正好是相反的,前者从高到低,后者从低到高
以上例子只是为了演示 ZUNIONSTORE 的使用,并无实际意义。