redis 有序集合(sorted set) 之 ZUNIONSTORE 使用

前提:还不了解的可以先了解一下ZUNIONSTORE 的使用

以下是3天,文章id为,1000,1001,1002 的浏览量

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号

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号

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号

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天文章的总访问量

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倍。

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.为了更直观一点,我们对子集重新赋值

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.最多:

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 的使用,并无实际意义。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值