*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 仍会被创建(或覆盖)。