*Redis SDIFFSTORE 命令 计算差集并存储到新集合
*语法
SDIFFSTORE destination key [key ...]
*说明
计算给定的多个 Set 集合之间的差集(difference set),并将结果存储到 destination 目标集合中。
如果 destination 已经存在,它会被覆盖(overwrite)。如果 destination 原本存储的不是 Set 类型,它会被强制替换为新的 Set。
数学定义:差集 = 第一个 key 中存在的成员,但在后续所有集合中都不存在的成员。
如果 key 不存在,Redis 将其视为一个空的 Set 集合。例如:
- 如果第一个
key不存在,差集为空,destination将被清空或创建为空集合。 - 如果后续某个
key不存在,它不会对差集结果产生影响(因为空集不改变差集)。
重要提示:SDIFFSTORE 生成的结果集合中的成员顺序是不确定的(unspecified order)。
*返回值
- Integer:存储到
destination集合中的成员数量。如果结果为空,则返回0。
*时间复杂度
- O(N),其中
N是所有参与运算的集合的成员总数。
*版本兼容性
| Redis 版本 | 变更说明 |
|---|---|
| >= 1.0.0 | 初始支持 |
*示例
*示例 1:将差集存储到新集合
# 创建集合 A 和 B
SADD set_a "a" "b" "c" "d"
# 返回:(integer) 4
SADD set_b "b" "c" "e"
# 返回:(integer) 3
# 将 A - B 的差集存储到 result
SDIFFSTORE result set_a set_b
# 返回:(integer) 2
SMEMBERS result
# 返回:1) "a" 2) "d"(顺序随机)
*示例 2:覆盖已存在的 destination
# destination 原本是一个字符串
SET temp_key "hello"
# 返回:OK
# 执行 SDIFFSTORE,temp_key 会被覆盖为 Set 类型
SADD s1 "x" "y" "z"
# 返回:(integer) 3
SADD s2 "y"
# 返回:(integer) 1
SDIFFSTORE temp_key s1 s2
# 返回:(integer) 2
TYPE temp_key
# 返回:set
SMEMBERS temp_key
# 返回:1) "x" 2) "z"(顺序随机)
*示例 3:多个集合的差集存储
SADD pool "a" "b" "c" "d" "e"
# 返回:(integer) 5
SADD exclude1 "b" "c"
# 返回:(integer) 2
SADD exclude2 "d"
# 返回:(integer) 1
# pool - exclude1 - exclude2
SDIFFSTORE remaining pool exclude1 exclude2
# 返回:(integer) 2
SMEMBERS remaining
# 返回:1) "a" 2) "e"(顺序随机)
*示例 4:实时过滤未活跃用户
# 所有注册用户
SADD registered "user1" "user2" "user3" "user4" "user5"
# 返回:(integer) 5
# 今天登录的用户
SADD logged_in_today "user1" "user3"
# 返回:(integer) 2
# 今天未登录的用户存储到 inactive_today
SDIFFSTORE inactive_today registered logged_in_today
# 返回:(integer) 3
SMEMBERS inactive_today
# 返回:1) "user2" 2) "user4" 3) "user5"(顺序随机)