*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

*最佳实践

  1. 合并排行榜:多个维度排行榜合并为总榜,WEIGHTS 加权求和。

  2. WEIGHTS 加权合并:不同来源的 score 量级不同时,使用 WEIGHTS 统一量级后再聚合。

  3. AGGREGATE MIN/MAX 场景:合并多个榜单时,使用 MIN 或 MAX 聚合取最优成绩而非累加。

  4. 大数据量用 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 更适合大数据量,因为它避免将大数组传输到客户端,节省网络带宽。