集合交集运算是什么
求多个集合的交集有三种用法:直接返回结果、把结果存到目标键、或只返回交集元素个数。第三种(较新版本提供的基数版)还支持限制数量,在「只关心有没有交集」或「只需要大概多少」时能提前结束计算,省掉全量遍历。
基本信息
| 返回交集 | SINTER 键 键 …,直接给结果 |
|---|---|
| 存储交集 | SINTERSTORE 目标键 键 键 …,结果写入新键 |
| 基数交集 | SINTERCARD 集合数 键 键 …,可加数量限制 |
| 计算规模 | 与参与集合中最小集合的规模相关 |
| 空集合影响 | 任一集合为空则交集为空 |
典型使用场景
- 共同关注与共同好友:两个用户关注集合求交集
- 标签筛选:命中多个标签的内容取交集,实现多条件筛选
- 权限校验:用户权限与所需权限求交集,判断是否满足
- 活动人群圈选:多个条件人群求交集生成定向名单
- 数量判断:只需要知道是否为空的场景用基数版并加限制
示例
示例
SADD follow:A u2 u3 u4
SADD follow:B u3 u4 u5
SCARD follow:A # 先看规模
SINTER follow:A follow:B # 交集:u3 u4
SINTERSTORE common:AB follow:A follow:B # 结果存键,返回交集个数
EXPIRE common:AB 3600 # 临时结果键务必设过期
SINTERCARD 2 follow:A follow:B # 只要交集个数
SINTERCARD 2 follow:A follow:B LIMIT 10 # 数到 10 个即返回,提前结束命令对照
| 命令 | 返回 | 适用 |
|---|---|---|
| 返回交集 | 交集成员数组 | 需要具体成员列表 |
| 存储交集 | 交集元素个数,同时写入目标键 | 结果要复用或多次读取 |
| 基数交集 | 交集元素个数 | 只关心数量 |
| 基数交集加限制 | 达到限制即返回 | 只判断是否有交集 |
交集的计算量取决于参与集合的规模:把大集合两两求交集,会显著占用实例的计算时间。
存储交集产生的临时键如果不设过期:结果会长期驻留内存,日积月累成为容量问题。
设计前确认三件事
- 确认集合规模:交集代价取决于最小集合的大小,大集合要评估计算时间
- 确认结果用途:只需判断有无交集时优先用带数量限制的基数版本
- 确认失效时机:集合变更后旧结果立即失真,缓存结果要能失效或更新