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

### Redis 有序集合Sorted Set)常用命令及用法 #### 添加成员到有序集合 `ZADD key score member [score member ...]` 命令用于向指定键的有序集中添加一个或多个成员,或者更新已存在成员的分数。如果某个成员已经存在于该有序集中,则其旧分数会被新分数覆盖。 ```bash ZADD myzset 1 "one" ZADD myzset 2 "two" ``` 此命令允许一次性插入多条记录,并能处理重复项的情况[^1]。 #### 获取成员排名 可以通过 `ZRANK key member` 和 `ZREVRANK key member` 来分别获得给定成员按升序排列的位置索引以及降序位置索引。返回值是从0开始计数;若找不到对应成员则返回nil。 ```bash ZRANK myzset "two" # 返回 1 (因为下标从0算起) ZREVRANK myzset "two" # 返回 0 ``` 这些功能对于构建排行榜非常有用,在实际应用场景中能够快速定位特定用户的名次[^2]。 #### 查询区间内的元素 利用 `ZRANGE key start stop [WITHSCORES]` 可以按照从小到大顺序取出[start,stop]之间的所有节点及其对应的权重分值(可选参数),而 `ZREVRANGE key start stop [WITHSCORES]` 则相反地实现了由高至低取值的功能。 ```bash ZRANGE myzset 0 -1 WITHSCORES # 输出全部成员连同它们各自的得分 ZREVRANGE myzset 0 -1 WITHSCORES # 同上但是逆序显示 ``` 这有助于展示前几名用户或是最后几位参与者的信息列表。 #### 删除指定成员 当需要移除某些不再符合条件的对象时,可以采用 `ZREM key member [member ...]` 方法来完成这项工作。它接受单个或多于一名成员作为参数并将其彻底清除掉。 ```bash ZREM myzset "one" ``` 上述操作简单明了,便于维护动态变化的数据集。 #### 计算交集与并集 `ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]` 能够求得两个及以上不同源之间共同拥有的部分并将结果存储在一个新的目标容器里;同样地,`ZUNIONSTORE` 执行的是联合运算。值得注意的是,默认情况下普通集合中的每一条目都被视为具有单位权值即1来进行累加计算[^3]。 ```bash ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM ``` 这里展示了如何灵活运用多种聚合方式对来自不同地方的数据进行综合分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值