带权重的有序集合合并
ZUNIONSTORE 与 ZINTERSTORE 把多个有序集合做并集或交集,结果写入目标键。两者都支持 WEIGHTS 给每个输入集合设系数、AGGREGATE 指定 SUM、MIN、MAX 三种聚合方式,因此常用于日榜合成周榜、月榜这类带权重汇总场景。
基本信息
| 适用 | Redis 2.0 及以上,有序集合命令 |
|---|---|
| 语法 | ZUNIONSTORE dest numkeys key [key ...] [WEIGHTS w ...] [AGGREGATE SUM|MIN|MAX] |
| 返回 | 结果集合的成员数 |
| 默认行为 | 权重全为 1,聚合方式为 SUM |
示例
示例
ZADD d1 10 u1 20 u2 # 第一天榜单
ZADD d2 30 u1 5 u2 # 第二天榜单
ZUNIONSTORE week 2 d1 d2 # 默认 SUM 聚合:u1=40 u2=25
ZUNIONSTORE week2 2 d1 d2 WEIGHTS 2 1 AGGREGATE MAX # 加权后取最大:u1=max(20,30)=30
ZINTERSTORE both 2 d1 d2 AGGREGATE MIN # 交集取小:只保留两个榜单都出现的成员
ZRANGE week 0 -1 WITHSCORES # 查看合并结果
EXPIRE tmp:week 3600 # 临时汇总键及时设置过期参数与结果读法
| 参数 | 含义 | 使用要点 |
|---|---|---|
| dest | 结果写入的目标键 | 会覆盖同名键的原有数据 |
| numkeys | 参与计算的集合个数 | 必须与实际键数一致,否则报错 |
| WEIGHTS | 每个输入集合的系数,默认 1 | 权重顺序要与键顺序一一对应 |
| AGGREGATE | SUM(默认)/ MIN / MAX | 同一成员在不同集合的分数如何合成 |
| 返回值 | 结果集合成员数 | 可用于校验合并是否符合预期 |
典型使用场景
- 日榜合成周榜与月榜,按权重区分不同日期的贡献
- 多维度评分合并:热度与质量分各带系数求和
- 交集筛选:找出同时在两个榜单中的用户做定向运营
- 周期性汇总任务:定时计算并把结果写入带过期时间的缓存键
- 数据校验:对比合并结果与离线计算结果是否一致
Set 的 SUNION 与 ZSet 的 ZUNIONSTORE 名称相近但语义不同,后者带分数聚合;同一需求里混用两种类型容易出现口径不一致。
结果键写入是覆盖操作,数据量大时计算与写入都集中在主线程,高峰合并大集合容易造成延迟抖动,应放到低谷执行。
相邻命令与命名建议
- ZDIFFSTORE 求差集,常用于剔除已中奖或已下架的成员
- 结果键使用独立命名空间前缀,便于批量清理与识别
- 合并前先确认输入集合规模,避免高峰在主线程做长时间计算