*Redis ZINTER 命令
返回多个 Sorted Set 的交集。Redis 6.2+ 引入。
*语法
ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX] [WITHSCORES]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| numkeys | Integer | 是 | key 的数量 |
| key | String | 是 | Sorted Set 键名 |
| WEIGHTS | Double | 否 | 权重 |
| AGGREGATE | 标志 | 否 | SUM(默认)、MIN、MAX |
| WITHSCORES | 标志 | 否 | 同时返回 score |
*返回值
| 条件 | 返回值 |
|---|---|
| 有交集 | member 数组;WITHSCORES 时 [member, score, ...] |
| 无交集 | 空数组 [] |
*时间复杂度
O(N*log(M)),N 为最小集合大小,M 为最大集合大小。
*示例
> ZADD zset1 1 a 2 b 3 c
(integer) 3
> ZADD zset2 2 b 3 c 4 d
(integer) 3
> ZINTER 2 zset1 zset2 WITHSCORES
1) "b"
2) "4" # 2+2=4
3) "c"
4) "6" # 3+3=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 |
| ERR syntax error | WEIGHTS 数量少于 numkeys | 确保 WEIGHTS 后跟的数量与 numkeys 相等,默认均为 1 |
| ERR syntax error | AGGREGATE 参数拼写错误或传入不支持值 | 仅支持 SUM、MIN、MAX,检查拼写和大小写 |
*最佳实践
交集排行榜:多个维度都上榜的用户,计算综合排名。
WEIGHTS 加权求和:不同维度的 score 重要性不同时,使用 WEIGHTS 调整权重再聚合。
AGGREGATE MIN 取最小值:多维度考核场景,使用 MIN 聚合取各维度最低分作为综合分。
大数据量用 ZINTERSTORE:结果成员数量 > 1000 时,使用 ZINTERSTORE 替代 ZINTER 避免阻塞网络。
*5. 版本兼容性:ZINTER 是 Redis 6.2+ 命令,低版本使用 ZINTERSTORE + ZRANGE 替代。
*FAQ
Q1: ZINTER 和 SINTER 有什么区别? A: ZINTER 操作 Sorted Set,支持 score 聚合;SINTER 操作 Set。
Q2: ZINTER 返回的成员有顺序吗? A: 有。按聚合后的 score 从小到大排序返回。
Q3: 交集为空时返回什么?
A: 返回空数组 []。
Q4: WEIGHTS 默认值是多少? A: 默认所有集合的权重为 1,即直接相加。
Q5: ZINTER 和 ZINTERSTORE 性能有差异吗? A: 计算逻辑相同,差异在于结果传输方式。大数据量时 ZINTERSTORE 网络开销更小。