SDIFF、SDIFFSTORE:对集合执行差集计算

SDIFF 命令可以计算出给定集合之间的差集,并返回差集包含的所有元素:

  1. SDIFF set [set ...]

SDIFF 命令会按照用户给定集合的顺序,从左到右依次地对给定的集合执行差集计算。

举个例子,对于以下这三个集合来说:

  1. redis> SMEMBERS s1
  2. 1) "a"
  3. 2) "b"
  4. 3) "c"
  5. 4) "d"
  6.  
  7. redis> SMEMBERS s2
  8. 1) "c"
  9. 2) "d"
  10. 3) "e"
  11. 4) "f"
  12.  
  13. redis> SMEMBERS s3
  14. 1) "b"
  15. 2) "f"
  16. 3) "g"

如果我们执行以下命令:

  1. redis> SDIFF s1 s2 s3
  2. 1) "a"

那么 SDIFF 命令首先会对集合 s1 和集合 s2 执行差集计算,得到一个包含元素 "a""b" 的临时集合,然后再使用这个临时集合与集合 s3 执行差集计算。换句话说,这个 SDIFF 命令首先会计算出 s1-s2 的结果,然后再计算 (s1-s2)-s3 的结果。

SDIFFSTORE 命令

SINTERSTORE 命令和 SUNIONSTORE 命令一样,Redis 也为 SDIFF 命令提供了相应的 SDIFFSTORE 命令,这个命令可以把给定集合之间的差集计算结果储存到指定的键里面,并在键已经存在的情况下,自动覆盖已有的键:

  1. SDIFFSTORE destination_key set [set ...]

SDIFFSTORE 命令会返回被储存的差集元素数量作为返回值。

作为例子,以下代码展示了怎样将集合 s1s2s3 的差集计算结果储存到集合 diff-result 里面:

  1. redis> SDIFFSTORE diff-result s1 s2 s3
  2. (integer) 1 -- 计算出的差集只包含一个元素
  3.  
  4. redis> SMEMBERS diff-result
  5. 1) "a"

其他信息

属性
复杂度SDIFF 命令和 SDIFFSTORE 命令的复杂度都是 O(N) ,其中 N 为所有给定集合包含的元素数量总和。
版本要求SDIFF 命令和 SDIFFSTORE 命令从 Redis 1.0.0 版本开始可用。

注解

执行集合计算的注意事项

因为对集合执行交集、并集、差集等集合计算需要耗费大量的资源,所以在有可能的情况下,用户都应该尽量使用 SINTERSTORE 等命令来储存并重用计算结果,而不要每次都重复进行计算。

此外,当集合计算涉及的元素数量非常巨大时,Redis 服务器在进行计算时可能会被阻塞。这时,我们可以考虑使用 Redis 的复制功能,通过从服务器来执行集合计算任务,从而确保主服务器可以继续处理其他客户端发送的命令请求。

本书将在之后的《复制》一章中对 Redis 的复制功能进行介绍。