SINTERCARD 是什么
SINTERCARD 直接返回多个集合交集的元素个数(基数),不生成结果集,也不需要临时键。7.0 起提供,替代了过去「先 SINTERSTORE 落库、再 SCARD 计数、最后删临时键」的繁琐写法。它还支持 LIMIT 参数提前终止:只要交集大小达到上限就立即返回,适合「是否至少共同 N 个」这类判断。语法首位必须写集合个数 numkeys。
基本信息
| 语法 | SINTERCARD numkeys key [key ...] [LIMIT n] |
|---|---|
| 返回 | 交集元素个数;使用 LIMIT 时最多返回该上限值 |
| numkeys | 首位必填,且必须与实际键数量一致 |
| LIMIT | 0 表示不限制;达到上限即提前返回 |
| 版本 | Redis 7.0 及以上 |
典型使用场景
- 共同标签判断:两个用户标签集合是否有足够多的共同项
- 条件筛选计数:多个筛选条件的交集规模,用于展示「符合条件的数量」
- 规则校验:判断某组合是否满足「至少包含 N 个必需项」
- 省内存统计:不需要交集成员列表,只要数量时避免生成临时键
- 限流判断:用 LIMIT 1 快速判断是否存在交集,命中即返回
用法示例
用法示例
SADD s1 a b c d
SADD s2 b c d e
# 交集基数:b、c、d 共 3 个
SINTERCARD 2 s1 s2
# 加 LIMIT:达到上限就停,返回的是上限值不是真实总数
SINTERCARD 2 s1 s2 LIMIT 2
# 旧写法对照:需要生成临时键,再计数再删除
SINTERSTORE tmp s1 s2
SCARD tmp
DEL tmp
# 确认集合内容
SMEMBERS s1参数读法
| 参数 | 含义 | 注意 |
|---|---|---|
| numkeys | 参与运算的集合个数 | 写在最前面,与实际键数不一致会报错 |
| key ... | 参与交集的集合键 | 集群下需同槽,否则报跨槽错误 |
| LIMIT n | 最多数到 n 个就返回 | 返回上限值,不代表真实交集大小 |
| LIMIT 0 | 不限制,返回真实基数 | 大集合下耗时较长 |
计算成本与集合规模相关:元素规模很大时单条命令会长时间占用主线程。高并发场景应先把集合规模收敛,或改为离线计算后读取结果。
LIMIT 的语义要记清:返回达到上限就停,结果值等于上限,只能说明「至少这么多」。需要精确基数时不要使用 LIMIT。