暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(31):SDIFF、SINTER和SUNION命令

原创 AlbertS 2020-01-02
3258

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议

前言

今天学习的这几个命令是集合中很常见的操作,集合的交集和并集经常被使用,最早接触这两种操作是高中的数学课本上,集合是单独的一章,就连高考题中集合的题目也经常出现,接下来我们看一下在 redis 中的集合具体是怎样操作的。

这篇笔记中的3个命令分别是 SDIFF 、 SINTER 、 SUNION ,之前没有这几种类似的操作,不过可以复习一下 SADD 命令向集合中添加元素:

SDIFF

  • 最早出现版本:1.0.0
  • 时间复杂度:O(N)
  • 命令参数: SDIFF key [key …]
  • 操作类型:sets
  • 官方文档

作用

该命令是用来计算差集的,类似于减法操作, SDIFF 应该是 set difference 的缩写,其实就是在集合上做减法的意思。

第一个参数是初始集合,也可以看成是被减数,后面的参数都是减数集合,相当于从第一个集合中减去后面集合中出现的元素。

当指定的键值不存在时被认为是空的集合,当指定的键不是集合类型时会给出报错信息。

该命令返回的是一个列表,表示差集的结果,当然结果也可能为空。

练习

使用 SADD 命令创建两个集合然后求差集:

127.0.0.1:6379> SADD nset1 1 2 3 4
(integer) 4
127.0.0.1:6379> SDIFF nset1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SADD nset2 2 4 6 7
(integer) 4
127.0.0.1:6379> SDIFF nset1 nset2
1) "1"
2) "3"
127.0.0.1:6379> SMEMBERS nset1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379>
复制

这里我们看到虽然做了差集,但是原来的集合实际上并没有发生改变。

SINTER

  • 最早出现版本:1.0.0
  • 时间复杂度:O(N*M) (N是集合中元素数的最小个数,M是求交集的集合数量)
  • 命令参数:SINTER key [key …]
  • 操作类型:sets
  • 官方文档

作用

求多个集合的交集,sinter 应该是 set intersection 的缩写,交集的定义其实就是求交集的两个集合中都包含的元素,当参数指定的键不存在时被认为是一个空集合。

返回值是一个列表,包含最后求交集的元素,当然结果也可以为空列表,如果参数中包含不存在的键或者一个空的集合,那么结果一定是空的。

练习

使用 SADD 命令创建两个多元素的集合,然后使用 SINTER 求交集查看结果:

127.0.0.1:6379> SADD nset1 1 2 3 4
(integer) 4
127.0.0.1:6379> SMEMBERS nset1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SADD nset2 2 4 6 7
(integer) 4
127.0.0.1:6379> SMEMBERS nset2
1) "2"
2) "4"
3) "6"
4) "7"
127.0.0.1:6379> SINTER nset1 nset2
1) "2"
2) "4"
127.0.0.1:6379> SMEMBERS nset1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379>
复制

与 SDIFF 命令一样, SINTER 命令也不会影响原集合,只是将求交集的结果以列表的形式返回:

SUNION

  • 最早出现版本:1.0.0
  • 时间复杂度:O(N) (参数指定的所有集合中元素的总数)
  • 命令参数: SUNION key [key …]
  • 操作类型:sets
  • 官方文档

作用

求集合的并集,SUNION 命令应该是 set union 的缩写,其实相当于将每个参数指定的集合中的元素全部使用 SADD 命令添加到结果的集合中。

当指定的键不存在时会被作为一个空集合,不会对结果产生影响,以列表的形式返回最后的并集。

练习

使用 SADD 命令创建两个多元素的集合,然后使用 SUNION 求并集查看结果:

127.0.0.1:6379> SADD nseta a b c d
(integer) 4
127.0.0.1:6379> SADD nsetb a c x z
(integer) 4
127.0.0.1:6379> SUNION nseta nsetb
1) "c"
2) "x"
3) "d"
4) "z"
5) "a"
6) "b"
127.0.0.1:6379> SMEMBERS nseta
1) "c"
2) "a"
3) "d"
4) "b"
127.0.0.1:6379> SMEMBERS nsetb
1) "c"
2) "a"
3) "x"
4) "z"
复制

总结

  1. SDIFF 命令可以求集合差集,从第二个集合开始,将集合中的元素依次从第一个集合中去掉,以列表形式返回第一个集合中剩余的元素。
  2. SINTER 命令可以求集合的交集,将结果以列表形式返回。
  3. SINTER 命令可以求集合的并集,相当于对多有的元素调用 SADD 命令插入到结果集中,将结果以列表形式返回。

2019-12-29 23:18:54

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论