*Redis ZUNIONSTORE 命令
计算多个 Sorted Set 的并集,并将结果存入 destination。
*语法
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| destination | String | 是 | 目标 Sorted Set 键名 |
| numkeys | Integer | 是 | 源集合数量 |
| key | String | 是 | 源 Sorted Set 键名 |
| WEIGHTS | Double | 否 | 权重 |
| AGGREGATE | 标志 | 否 | SUM(默认)、MIN、MAX |
*返回值
| 条件 | 返回值 |
|---|---|
| 计算完成 | 结果集合的 member 数量(Integer) |
*时间复杂度
O(N*log(M)),N 为所有集合成员总数,M 为结果集合大小。
*示例
> ZADD zset1 1 a 2 b
> ZADD zset2 2 b 3 c
> ZUNIONSTORE result 2 zset1 zset2 WEIGHTS 1 2
(integer) 3
> ZRANGE result 0 -1 WITHSCORES
1) "a"
2) "1"
3) "b"
4) "6" # 2*1 + 2*2 = 6
5) "c"
6) "6" # 0*1 + 3*2 = 6
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| 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 |
| 覆盖已有 destination 导致数据丢失 | destination 已存在会被覆盖 | 执行前检查 destination 是否存在,或选择合理的键名避免冲突 |
| ERR syntax error | WEIGHTS 或 AGGREGATE 参数使用错误 | 确保 WEIGHTS 数量等于 numkeys,AGGREGATE 仅支持 SUM/MIN/MAX |
*最佳实践
合并排行榜缓存:多维度排行榜加权合并后存入缓存,供快速查询。
TTL 管理:为 destination 设置过期时间,避免并集缓存长期占用内存。
numkeys 动态计算:程序中拼接命令时,动态计算 key 数量填入 numkeys,防止手误。
监控计算耗时:并集计算复杂度为 O(N*log(M)),大集合运算应在低峰期执行或异步处理。
*5. 渐进式合并:多个集合合并时,如果集合数量过多,考虑分批合并减少单次计算压力。
*FAQ
Q1: ZUNIONSTORE 和 ZUNION 有什么区别? A: ZUNION 返回结果数组;ZUNIONSTORE 存入新 Sorted Set。大数据量用 ZUNIONSTORE。
Q2: ZUNIONSTORE 的 numkeys 怎么算? A: numkeys 等于后面跟着的源 key 的数量,不包括 destination。
Q3: 源集合为空时 ZUNIONSTORE 返回什么? A: 返回 0,并清空(或创建空的)destination。
Q4: WEIGHTS 可以设置负数吗? A: 可以。Redis 允许负权重,但结果 score 可能为负数,需业务层确认是否接受。
Q5: ZUNIONSTORE 和 ZUNION 在内存使用上有什么区别? A: ZUNIONSTORE 结果写入新 key,源集合和结果同时占用内存;ZUNION 仅临时占用服务端内存,结果发送到客户端后释放。