首页/数据/Redis 进阶速查/SINTERCARD:带上限的交集计数
数据结构与选型42 条

SINTERCARD:带上限的交集计数

SINTERCARD 只计算多个集合交集基数,可用 LIMIT 提前收敛,避免 SINTERSTORE 生成大结果集的成本。

Redis 进阶速查数据更新于 2026-10-13

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 把相关键固定到同一分片。

易错点

  • 把带 LIMIT 的返回值当精确基数:达到上限时结果只是下界,对外口径会对不上
  • 用 SINTER 加 SCARD 替代:中间结果要经过网络与客户端内存,大集合上反而更贵
  • 对超大集合做无上限计算:复杂度随最小集合基数增长,可能长时间占用主线程
  • 集群里键分散在不同槽:直接报跨槽错误,需要用 hash tag 对齐
  • 忽略版本差异:7.0 以下没有该命令,客户端要准备降级路径

数据来源与参考

  • Redis 官方文档:SINTERCARD
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌