*Redis ZINTERSTORE 命令
ZINTERSTORE 计算一个或多个有序集合的交集,并将结果保存到目标有序集合中。
*语法
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| destination | String | 是 | 结果保存的目标键名 |
| numkeys | Integer | 是 | 参与交集运算的源集合数量 |
| key | String | 是 | 有序集合键名,至少一个 |
| WEIGHTS weight | Double | 否 | 每个源集合的权重乘数,默认 1 |
| AGGREGATE | Flag | 否 | 分数聚合方式:SUM(默认)、MIN、MAX |
*返回值
- Integer:结果集合中的成员数量
- Error:参数数量不足、numkeys 与实际 key 数量不匹配、键类型错误
*时间复杂度
O(N·K) + O(M·log(M)),其中:
- N 为最小源集合的基数
- K 为源集合数量
- M 为结果集合基数
*示例
*基本交集
> ZADD z1 1 "a" 2 "b" 3 "c"
(integer) 3
> ZADD z2 2 "b" 3 "c" 4 "d"
(integer) 3
> ZINTERSTORE result 2 z1 z2
(integer) 2
> ZRANGE result 0 -1 WITHSCORES
1) "b"
2) "4"
3) "c"
4) "6"
*带权重交集
> ZADD teamA 10 "player1" 20 "player2"
(integer) 2
> ZADD teamB 5 "player1" 15 "player2"
(integer) 2
> ZINTERSTORE total 2 teamA teamB WEIGHTS 2 1 AGGREGATE SUM
(integer) 2
> ZRANGE total 0 -1 WITHSCORES
1) "player1"
2) "25"
3) "player2"
4) "55"
*与空集合交集
> ZADD z3 1 "x"
(integer) 1
> ZINTERSTORE empty 2 z3 noexist
(integer) 0
> EXISTS empty
(integer) 1
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 参数不足 | 确保提供 destination、numkeys 和 key |
| ERR value is not an integer | numkeys 非整数 | numkeys 必须是整数 |
| ERR syntax error | WEIGHTS 数量与 key 数量不匹配 | 确保每个 key 对应一个 weight |
| WRONGTYPE | key 不是有序集合 | 检查 key 的数据类型 |
*最佳实践
- 场景:共同好友、多维度筛选后的评分聚合、跨集合排名
- 交集运算会自动覆盖 destination 已有内容
- 使用 AGGREGATE MIN/MAX 可筛选多维度下的最低/最高评分
- 大集合交集注意时间复杂度,评估是否分步处理
- 配合 EXPIRE 给结果集合设置过期,避免缓存长期驻留
*FAQ
Q1: 交集结果的分数是怎么计算的? A: 默认 SUM。例如成员 "b" 在 z1 分数为 2,在 z2 分数为 2,交集后分数为 4。
Q2: WEIGHTS 的作用是什么? A: 计算分数前先乘以权重。例如 WEIGHTS 2 1 表示第一个集合分数 ×2,第二个 ×1,再聚合。
Q3: 源集合不存在会怎样? A: 视为空集合。任何集合与空集合交集结果都是空集合,destination 仍会被创建(或覆盖)。