并集与差集
SUNION 求多个集合的并集并自动去重,SDIFF 求「在第一个集合但不在后面集合」的差集,方向敏感:A 减 B 与 B 减 A 结果完全不同。两者都有 STORE 变体,把结果落到目标键并返回结果基数,适合标签合并、黑名单剔除与人群圈选这类需求。
基本信息
| 适用 | Redis 1.0 及以上 Set 命令 |
|---|---|
| SUNION | 并集去重,只输出不落盘 |
| SDIFF | 差集,方向敏感,基准集合放第一位 |
| STORE 变体 | SUNIONSTORE、SDIFFSTORE、SINTERSTORE,计算并写入目标键 |
示例
示例
SADD a x y z
SADD b y z w
SUNION a b # x y z w:并集去重
SDIFF a b # x:A 有而 B 没有
SDIFF b a # w:方向反过来结果不同
SINTER a b # y z:交集
SUNIONSTORE all:ab a b # 返回 4,结果存进 all:ab
SDIFFSTORE only:a a b # 返回 1,结果存进 only:a
SINTERCARD 2 a b LIMIT 100 # 只看交集的规模,避免取出全部成员
EXPIRE all:ab 3600 # 结果键设置过期,避免长期占用内存命令与结果读法
| 命令 | 结果 | 注意 |
|---|---|---|
| SUNION | 并集,成员去重 | 多个大集合全量输出压力大 |
| SDIFF | 有方向的差集 | 基准集合必须放第一位 |
| SINTER | 交集 | 适合筛选同时满足多个条件的人群 |
| SINTERCARD | 交集基数,可加 LIMIT | 只看规模时比取出成员更省资源 |
| STORE 变体 | 返回结果基数并落盘 | 目标键内容会被覆盖,需独立命名 |
典型使用场景
- 标签合并:把多个标签集合求并集得到候选人群
- 黑名单剔除:用差集从基础上再筛掉命中黑名单的用户
- 交集圈选:找出同时满足两个条件的用户集合
- 结果缓存:用 STORE 变体把合并结果落盘并设置过期
- 规模评估:用 SINTERCARD 估算交集大小再决定是否全量处理
SDIFF 不是对称差:要得到「只出现在其中一个集合」的成员,需要用并集减去交集,而不是直接做差集。
对大集合作并集或差集会在主线程一次完成,成员数量大时耗时与网络开销都很可观,应放在低峰执行或改用 SINTERCARD 先估算规模。
组合计算提示
- 输入集合可以有多个,复杂筛选拆成多步计算比一条命令更好维护
- 结果键统一加前缀并设置过期,便于集中清理与识别