SINTERCARD 是什么
SINTERCARD 只计算多个集合交集的基数,不生成结果集。Redis 7.0 起提供,语法里先给集合个数再列键名,可选 LIMIT 参数用于提前收敛。它替代的是「先求交集再数个数」的两步法:既不产生中间结果,也不占用额外的网络与内存,是共现统计与阈值判定场景的标准选择。
基本信息
| 语法 | SINTERCARD numkeys key [key ...] [LIMIT limit] |
|---|---|
| 版本 | Redis 7.0 起 |
| 返回 | 交集基数;触及 LIMIT 时返回该上限值 |
| 复杂度 | 最坏 O(N*M),N 为最小集合基数、M 为集合个数 |
| 集群要求 | 参与运算的键必须在同一个 slot |
| 低版本替代 | SINTER 加 SCARD 两步法 |
典型使用场景
- 共现统计:标签或好友的共同成员数量,只关心数量不关心清单
- 阈值判定:判断交集是否超过 N,用 LIMIT 提前收敛停止计算
- 去重统计:确认两个候选池的重叠规模,再决定是否合并
- 风控与画像:圈层重叠度计算,避免生成中间结果集
- 大集合限界:集合很大又只需要量级时,用 LIMIT 控制计算成本
最小示例
最小示例
redis-cli SINTERCARD 2 tag:a tag:b # 精确交集基数
redis-cli SINTERCARD 2 tag:a tag:b LIMIT 1000 # 达到 1000 即返回,用于阈值判定
redis-cli SINTERCARD 1 tag:a # 只传一个集合,等价于 SCARD
redis-cli SCARD tag:a # 对照单个集合的规模
redis-cli SINTERSTORE tmp:both tag:a tag:b # 旧写法:会生成结果集,慎用
redis-cli -c SINTERCARD 2 {u:1}:a {u:1}:b # 集群下用 hash tag 保证同槽写法对照
| 写法 | 是否生成结果集 | 适用场景 |
|---|---|---|
| SINTERCARD 精确 | 否 | 只要数量且规模可控 |
| SINTERCARD 带 LIMIT | 否 | 阈值判定,触及上限即返回 |
| SINTER 加 SCARD | 否,但结果走网络 | 低版本替代方案,数据量要小 |
| SINTERSTORE 加 SCARD | 是 | 需要复用中间结果,必须先评估体积 |
LIMIT 是提前收敛而不是过滤:返回值等于 LIMIT 时只能说明「至少这么多」,不能当精确基数用于对外口径。
单集合调用等价于 SCARD;集群模式下参与运算的键必须在同一个槽,通常用 hash tag 把相关键固定到同一分片。