*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"(顺序随机)