首页/数据/数据库速查/ZUNIONSTORE / ZINTERSTORE 带权合并
Redis 命令96 条

ZUNIONSTORE / ZINTERSTORE 带权合并

多 ZSet 合并计算:WEIGHTS 加权重、AGGREGATE SUM/MIN/MAX 指定聚合方式,结果存到目标键;适合周榜/月榜汇总。

数据库速查数据更新于 2026-10-13

带权重的有序集合合并

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权重顺序要与键顺序一一对应
AGGREGATESUM(默认)/ MIN / MAX同一成员在不同集合的分数如何合成
返回值结果集合成员数可用于校验合并是否符合预期

典型使用场景

  • 日榜合成周榜与月榜,按权重区分不同日期的贡献
  • 多维度评分合并:热度与质量分各带系数求和
  • 交集筛选:找出同时在两个榜单中的用户做定向运营
  • 周期性汇总任务:定时计算并把结果写入带过期时间的缓存键
  • 数据校验:对比合并结果与离线计算结果是否一致
Set 的 SUNION 与 ZSet 的 ZUNIONSTORE 名称相近但语义不同,后者带分数聚合;同一需求里混用两种类型容易出现口径不一致。
结果键写入是覆盖操作,数据量大时计算与写入都集中在主线程,高峰合并大集合容易造成延迟抖动,应放到低谷执行。

相邻命令与命名建议

  • ZDIFFSTORE 求差集,常用于剔除已中奖或已下架的成员
  • 结果键使用独立命名空间前缀,便于批量清理与识别
  • 合并前先确认输入集合规模,避免高峰在主线程做长时间计算

易错点

  • 结果键忘记设置 EXPIRE:临时汇总键长期占内存,越积越多
  • 忽略汇总本身的开销:输入集合很大时合并是 O(N) 量级,高峰期执行会拖慢实例
  • WEIGHTS 的顺序与键顺序不匹配:分数合成结果错误但不会报错,需用 ZRANGE 抽查核对
  • 目标键与输入键同名:写入时覆盖输入数据,结果完全不同且不可恢复

数据来源与参考

  • Redis 官方文档: ZUNIONSTORE
  • Redis 官方文档: ZINTERSTORE

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌