*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

*最佳实践

  1. 合并排行榜缓存:多维度排行榜加权合并后存入缓存,供快速查询。

  2. TTL 管理:为 destination 设置过期时间,避免并集缓存长期占用内存。

  3. numkeys 动态计算:程序中拼接命令时,动态计算 key 数量填入 numkeys,防止手误。

  4. 监控计算耗时:并集计算复杂度为 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 仅临时占用服务端内存,结果发送到客户端后释放。