*Redis ZUNION 命令
返回多个 Sorted Set 的并集。Redis 6.2+ 引入。
*语法
ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX] [WITHSCORES]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| numkeys | Integer | 是 | key 的数量 |
| key | String | 是 | Sorted Set 键名 |
| WEIGHTS | Double | 否 | 每个集合的权重,默认 1 |
| AGGREGATE | 标志 | 否 | score 聚合方式:SUM(默认)、MIN、MAX |
| WITHSCORES | 标志 | 否 | 同时返回 score |
*返回值
| 条件 | 返回值 |
|---|---|
| 有并集 | member 数组;WITHSCORES 时 [member, score, ...] |
*时间复杂度
O(N*log(M)),N 为所有集合成员总数,M 为结果集合大小。
*示例
> ZADD zset1 1 a 2 b
(integer) 2
> ZADD zset2 2 b 3 c
(integer) 2
> ZUNION 2 zset1 zset2 WITHSCORES
1) "a"
2) "1"
3) "b"
4) "4" # 2+2=4,SUM 聚合
5) "c"
6) "3"
# MIN 聚合
> ZUNION 2 zset1 zset2 AGGREGATE MIN WITHSCORES
1) "a"
2) "1"
3) "b"
4) "2" # min(2, 2)=2
5) "c"
6) "3"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | numkeys 和实际传入的 key 数量不一致 | 调用前确认源集合数量,确保 numkeys 与实际 key 数量一致 |
| WRONGTYPE Operation against a key holding the wrong kind of value | 源 key 类型不是 Sorted Set | 使用 TYPE 命令确认所有源 key 类型为 zset |
| ERR syntax error | AGGREGATE 参数拼写错误,仅支持 SUM/MIN/MAX | 检查拼写,确保使用 SUM、MIN 或 MAX |
| ERR syntax error | WEIGHTS 数量与 numkeys 不匹配 | 确保 WEIGHTS 后跟随的数量等于 numkeys |
*最佳实践
合并排行榜:多个维度排行榜合并为总榜,WEIGHTS 加权求和。
WEIGHTS 加权合并:不同来源的 score 量级不同时,使用 WEIGHTS 统一量级后再聚合。
AGGREGATE MIN/MAX 场景:合并多个榜单时,使用 MIN 或 MAX 聚合取最优成绩而非累加。
大数据量用 ZUNIONSTORE:结果集预计超过 1,000 条时,优先使用 ZUNIONSTORE 避免大数组传输。
*5. 版本兼容性:ZUNION 是 Redis 6.2+ 命令,低版本使用 ZUNIONSTORE + ZRANGE 组合替代。
*FAQ
Q1: ZUNION 和 SUNION 有什么区别? A: ZUNION 操作 Sorted Set,支持 score 聚合;SUNION 操作 Set,无 score 概念。
Q2: ZUNION 返回的成员顺序是怎样的? A: 按聚合后的 score 从小到大排序。WITHSCORES 时同时返回 score。
Q3: 只有一个源集合时 ZUNION 返回什么? A: 返回该集合的所有成员,score 按权重和聚合方式计算(默认权重 1,SUM 聚合即原 score)。
Q4: 不同集合有相同 member 时 score 怎么处理? A: 按 AGGREGATE 方式聚合。默认 SUM,也可以 MIN 取最小值或 MAX 取最大值。
Q5: ZUNION 和 ZUNIONSTORE 哪个更适合大数据量? A: ZUNIONSTORE 更适合大数据量,因为它避免将大数组传输到客户端,节省网络带宽。